您的位置:首页 > 教程 > Mysql/MariaDB > mysql数据库隔离级别详解

mysql数据库隔离级别详解

2022-06-16 10:58:58 来源:易采站长站 作者:

mysql数据库隔离级别详解

目录
隔离级别一、mysql有四个事务隔离级别二、为什么默认RR隔离级别?三、RR隔离级别下手动加锁解决幻读理论基础脏读、不可重复读、幻读 及其解决方法事务隔离级别命令行操作操作验证一、实现脏读二、操作验证--实现不可重复读三、操作验证--解决不可重复读四、操作验证--实现幻读总结

wae站长之家-易采站长站-Easck.Com

隔离级别

wae站长之家-易采站长站-Easck.Com

一、mysql有四个事务隔离级别

每个级别都有字符或数字编号wae站长之家-易采站长站-Easck.Com

    读未提交>读已提交 READ COMMITTED | 1 : 解决脏读问题,存在不可重复读,幻读的问题。可重复读 REPEATABLE READ | 2 : 解决脏读,不可重复读的问题,存在幻读,默认隔离级别,使用MVCC机制实现可重复读。序列化 SERIALIZABLE | 3 : 解决脏读,不可重复读,幻读,可保证事务安全,但完全串行执行,性能最低。

我有记忆方法,先是RU、RC, 记住UC顺序,联想到UC WEB。wae站长之家-易采站长站-Easck.Com

wae站长之家-易采站长站-Easck.Com

二、为什么默认RR隔离级别?

RR级别作为mysql事务默认隔离级别,是事务完全和性能的折中。SERIALIZABLE级别是悲观地认为幻读时刻都会发生,故会自动地隐式地对事务所需资源加排他锁,其他事务访问此资源会被阻塞等待,故事务是安全的,但需要认值考虑性能。wae站长之家-易采站长站-Easck.Com

wae站长之家-易采站长站-Easck.Com

三、RR隔离级别下手动加锁解决幻读理论基础

InnoDB的行锁锁定的是索引,而不是记录本身。索引映射的记录存在就加行锁,如果不存在则会加next-key>

wae站长之家-易采站长站-Easck.Com

脏读、不可重复读、幻读>

脏读wae站长之家-易采站长站-Easck.Com

    一个事务读取到另一个事务还没有提交的数据。解决方法:把事务隔离级别调整到READ COMMITTED。

    不可重复读wae站长之家-易采站长站-Easck.Com

      一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。解决方法:把事务隔离级别调整到REPEATABLE READ。

      幻读wae站长之家-易采站长站-Easck.Com

        网上很多文章都说一个事务执行范围查询,两次select得到的条数不同,就叫幻读,这是错误的!!!幻读并不是说两次读取获取的结果集不同,幻读是指某一次select操作得到的结果所表征的数据状态无法支持后续的业务操作,具体例子:select某记录是否存在,不存在,准备插入此记录,但执行insert时发现此记录已存在,无法插入,此时就发生了幻读。还一种理解思路,就是因为先采用了"快照读",然后又用了"当前读",发现结果不同。比如先select是快照读,然后update、insert等,这时会用到当前读,发现操作出现未预料结果。

        幻读解决方法wae站长之家-易采站长站-Easck.Com

        1、把事务隔离级别调整到SERIALIZABLE。2、RR隔离级别下,对select操作手动加行锁,select ... for update,这也序列化隔离级别下隐式会做的事。wae站长之家-易采站长站-Easck.Com

        参考文章wae站长之家-易采站长站-Easck.Com

        幻读  https://segmentfault.com/a/1190000016566788wae站长之家-易采站长站-Easck.Com

        wae站长之家-易采站长站-Easck.Com

        事务隔离级别命令行操作

        1、查看隔离级别wae站长之家-易采站长站-Easck.Com

        1)查看当前会话隔离级别wae站长之家-易采站长站-Easck.Com

        mysql> SELECT @@tx_isolation;
        +-----------------+
        | @@tx_isolation  |
        +-----------------+
        | REPEATABLE-READ |
        +-----------------+
        1 row in set, 1 warning (0.00 sec)

        2)查看系统隔离级别wae站长之家-易采站长站-Easck.Com

        mysql> select @@global.tx_isolation;
        +-----------------------+
        | @@global.tx_isolation |
        +-----------------------+
        | READ-UNCOMMITTED      |
        +-----------------------+
        1 row in set, 1 warning (0.00 sec)

        2、设置隔离级别wae站长之家-易采站长站-Easck.Com

        SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]wae站长之家-易采站长站-Easck.Com

        1)设置当前会话wae站长之家-易采站长站-Easck.Com

        mysql> set session transaction isolation level repeatable read;
        Query OK, 0 rows affected (0.00 sec)

        2)设置系统wae站长之家-易采站长站-Easck.Com

        mysql> set global transaction isolation  level read uncommitted;                
        Query OK, 0 rows affected (0.00 sec)3、命令行,开始事务时用

        wae站长之家-易采站长站-Easck.Com

        操作验证

        自己在命令行去验证几种隔离级别下的读问题。wae站长之家-易采站长站-Easck.Com

        wae站长之家-易采站长站-Easck.Com

        一、实现脏读

        在不可提交读,>

        wae站长之家-易采站长站-Easck.Com

        wae站长之家-易采站长站-Easck.Com

        二、操作验证--实现不可重复读

        在可提交读,>

        wae站长之家-易采站长站-Easck.Com

        wae站长之家-易采站长站-Easck.Com

        三、操作验证--解决不可重复读

        repeatable>

        右边事务提交了,修改了age=29,左边再次查询,还是28。wae站长之家-易采站长站-Easck.Com

        wae站长之家-易采站长站-Easck.Com

        wae站长之家-易采站长站-Easck.Com

        四、操作验证--实现幻读

        repeatable>

        wae站长之家-易采站长站-Easck.Com

        wae站长之家-易采站长站-Easck.Com

        总结

        到此这篇关于mysql数据库隔离级别文章就介绍到这了,更多相关mysql隔离级别内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!wae站长之家-易采站长站-Easck.Com

        如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • mysql 5.7.30安装配置方法图文教程

    mysql 5.7.30安装配置方法图文教程

    之前把服务器里面的MySQL卸了重装,安装mysql时未做总结,换新电脑,补上安装记录,安装的时候,找了些网友的安装记录,发现好多坑 截个图,作为笔记,也正好留给需要的朋友们。
    2019-01-03
  • MySQL5.6免安装版环境配置图文教程

    MySQL5.6免安装版环境配置图文教程

    MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行。但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的。很多人下了zip格式的解压发现没有setup.exe,面对一堆文
    2019-01-04
  • Linux下安装mysql-8.0.20的教程详解

    Linux下安装mysql-8.0.20的教程详解

    ** Linux下安装mysql-8.0.20 ** 环境介绍 操作系统:CentOS 7 mysql下载地址:https://dev.mysql.com/downloads/mysql/ 下载版本:mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz 卸载mysql 查看是否安装过mysql,命令:fin
    2020-05-24
  • linux环境下安装mysql数据库的详细教程

    linux环境下安装mysql数据库的详细教程

    1.安装数据库 1)yum -y install mysql-server(简单) yum命令自动从网上寻找mysql服务资源,下载至本地并完成安装 2)也可以自己在网上下载mysql服务,通过xftp传输至Linux系统,自己安装(一般安
    2020-06-20
  • MySQL8.0.20安装教程及其安装问题详细教程

    MySQL8.0.20安装教程及其安装问题详细教程

    原文地址:https://blog.csdn.net/m0_46579864/article/details/105981304 官网下载MySQL的安装包 1.下载链接如下: MySQL8.0.20版本 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-20.html 其他版本:MySQL8.0.16版本
    2020-05-10
  • MySQL对数据库操作(创建、选择、删除)

    MySQL对数据库操作(创建、选择、删除)

    MySQL 创建数据库 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: CREATE DATABASE 数据库名; 以下命令简单的演示了创建数据库的过程,数据名为 RUNOOB: [root@host]# mysql
    2020-07-01
  • Linux系统MySQL8.0.19快速安装配置教程图解

    Linux系统MySQL8.0.19快速安装配置教程图解

    一、环境介绍 Linux系统使用yum安装MySQL需要从网上下载MySQL的一系列组件,这个过程非常耗时且有下载中断的可能,如果想要快速安装MySQL,可以先在网上将MySQL的离线包下载下来传到系
    2020-02-27
  • mysql 加了 skip-name-resolve不能链接数据库问题的解决方法

    mysql 加了 skip-name-resolve不能链接数据库问题的解决方法

    mysql 加了 skip-name-resolve不能链接的问题, 要确认 MySql 是否采用过主机名的授权 在 MySql Server 的配置文件 My.ini 中,增加如下两行: [mysqld] skip-name-resolve 它将禁止 MySql Server 对外部连接进
    2019-01-04