ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-02-09 10:06:28  阅读:216  来源: 互联网

标签:事务 隔离 read Mysql 增删 串行化 级别 四种


文章目录

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;

在这里插入图片描述

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


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签:事务,隔离,read,Mysql,增删,串行化,级别,四种
来源: https://blog.csdn.net/IT_Holmes/article/details/122641669

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有