Mysql 8的四种隔离级别以及对应不同类型的锁

文章目录

1. MySql 8的四个隔离级别


第一级别:read-uncommitted:

  • 有脏读,不可重复读,幻读的问题。

第二级别:read-committed:

  • 有不可重复度,幻读的问题。

第三级别:repeatable-read(可重复读):

  • 有幻读问题。

repeateable-read级别只限制了增删改,并没有限制查询操作。


第四级别:serializable(串行化):

  • 一开始不会阻塞查询(多个事务可以同时进行查询)。当其中一个事务要执行增删改就会触发可串行化,触发后会对增删改查都串行化,一旦串行化就是,事务之间的操作就会出现事务阻塞。

  • 这里的事务阻塞之间的一些增删改查操作是由时间限制的,超过一定时间就会报错,来重启事务。

举个例子:

在第四级别中,有两个a,b事务,两个事务之间进行查询操作是不会变化的!查询操作是不会被事务阻塞的!

但是,如果其中有一个事务进行了增删改的操作,例如:事务a进行了update操作。就会触发串行化的机制。

这样事务a的update操作就会被卡住,要等到事务b提交事务后,事务a才能继续执行。如果期间事务b又进行了update的操作,因为串行化后会有表级锁,锁住!因此不能执行其他增删改操作,就会报错!

如果事务b进行了提交,那么事务a的update就会进行操作了。但是因为串行化已经被触发,之后执行查询操作也会被事务阻塞!

上面的过程多处涉及到锁的内容!

2. 不同类型的锁


锁的分类:

一般可以分为两类,一个是悲观锁,一个是乐观锁,悲观锁一般就是我们通常说的数据库锁机制,乐观锁一般是指用户自己实现的一种锁机制。

  • 悲观锁:它对于数据被外界修改持保守态度,认为数据随时会修改,所以整个数据处理中需要将数据加锁。悲观锁一般都是依靠关系数据库提供的锁机制,事实上关系数据库中的行锁,表锁不论是读写锁都是悲观锁。

  • 乐观锁:顾名思义,就是很乐观,每次自己操作数据的时候认为没有人回来修改它,所以不去加锁,但是在更新的时候会去判断在此期间数据有没有被修改。

悲观锁按照使用性质划分:

  • 共享锁(Share locks简记为S锁):也称读锁,事务A对对象obj加共享锁,其他事务也只能对obj加共享锁,多个事务可以同时读,但不能有写操作,直到A释放共享锁。

  • 排它锁(Exclusivelocks简记为X锁):也称写锁,事务A对对象obj加排它锁以后,其他事务不能对obj加任何锁,只有事务A可以读写对象obj直到A释放排它锁。

  • 更新锁(简记为U锁):用来预定要对此对象施加排它锁,它允许其他事务读,但不允许再施加更新锁或排它锁;当被读取的对象将要被更新时,则升级为排它锁,主要是用来防止死锁的。

悲观锁按照作用范围划分:

  • 行锁:锁的作用范围是行级别,数据库能够确定那些行需要锁的情况下使用行锁,如果不知道会影响哪些行的时候就会使用表锁。

  • 表锁:锁的作用范围是整张表。

还有一个页锁,不常用。

3. 四个级别 对应的不同的锁


为了权衡『隔离』和『并发』的矛盾,ISO定义了四个事务的隔离级别,每个级别的隔离程度不同,允许出现的副作用也不同

  • 未提交读(read-uncommitted):最低级别,只能保证持久性
  • 已提交读(read-committed):语句级别
  • 可重复读(repeatable-read):事务级别
  • 串行化(serializable):*别,事务与事务完全串行化执行,毫无并发可言,性能极低。

我们说这个mysql的前提是使用的InnoDB类型mysql数据库:

锁机制:阻止其他事务对数据,各个隔离级别主要体现在读取数据时加的锁和释放时机

  • read-uncommitted(简称:RU):这里查询不加锁,但是增删改加了行级共享锁,直到事物被提交或回滚才会解锁。
  • read-committed(简称:RC):事务读取的时候,查询操作不会加锁。进行增删改时,会加行级共享锁,直到事物被提交或回滚才会解锁。
  • repeatable-read(简称:RR):事务读取时加行级共享锁,直到事务结束才会释放。
  • serializable(简称:SE):事务读取时加表级排它锁,直到事务结束时,才释放。这里因为有一个串行化的一种状态,未触发前只可以进行查询操作,一旦进行增删改串行化就会被触发,增删改查都会被事务阻塞!

4. 如何测试每个隔离级别使用的什么锁?


我们可以自己创建两个cmd窗口命令,set autocommit = 0;关闭自动提交,使用start transaction或直接启动一个select语句都可以开启一个事务。

这样我们就可以模拟一下上面的流程效果了。

每次测试前,我们都可以进行一个commit;事务提交。

以下是通过sql命令常用的命令:

  • strat transaction; 开启事务。
  • commit;提交事务, rollback;回滚事务。
  • show variables like ‘%auto%’; 查看提交状态命令。
  • set autocommit = 0; 关闭自动提交。
  • select @@transaction_isolation; 或 show variables like ‘transaction_isolation’;查看隔离级别。
  • set session transaction isolation level 隔离级别; 修改隔离级别。
-- 修改级别的mysql语句:
set session transaction isolation level Repeatable Read;

Mysql 8的四种隔离级别以及对应不同类型的锁

5. 有关事务相关的文档内容总结


Mysql 8的四种隔离级别以及对应不同类型的锁
Mysql 8的四种隔离级别以及对应不同类型的锁
Mysql 8的四种隔离级别以及对应不同类型的锁

上一篇:每天学一点——文件的基本操作


下一篇:添加MySql数据库超时设置的相关问题