二、InnoDB的REPEATABLE READ级别
InnoDB支持由SQL1992标准描述的所有四个事务隔离级别,默认隔离级别是 REPEATABLE READ 。
1、快照读:
在RR模式下,第一次读取会建立快照 , 后续查询会读取快照 。
这意味着,如果在同一事务中发出多个普通[ SELECT ](非锁定)语句,则这些 [ SELECT ]语句的结果也是一致的 。
2、[locking reads](锁定读取,又叫当前读)
[ SELECT ]语句中使用 FOR UPDATE 或 FOR SHARE
3、行锁
在RR模式下,使用当前读以及 [ UPDATE ]和 [ DELETE ]语句会对数据记录加行锁,锁定范围取决于该语句使用的是具有唯一搜索条件的唯一索引还是范围类型搜索条件 。
三、InnoDB的READ COMMITTED级别
1、在RC模式下,每次读取都会刷新快照,因此不能保证可重复读
2、在RC模式下 , 使用当前读以及 [ UPDATE ]和 [ DELETE ]语句会对数据记录加行锁,但是不会加范围锁,间隙锁定仅用于外键约束检查和重复键检查 。
3、由于禁用了间隙锁定,因此可能会产生幻影行问题 , 因为其mysql幻读怎么处理他会话可以在间隙中插入新行 。
4、 对于[ UPDATE ]或 [ DELETE ]语句 , InnoDB 仅对其更新或删除的行持有锁 。MySQL评估 WHERE 条件后,将释放不匹配行的记录锁。这大大降低了死锁的可能性,但是仍然可以发生 。
5、对于[ UPDATE ]语句,如果某行已被锁定,则 InnoDB执行“半一致”读?。?将最新提交版本的数据返回给MySQL,以便MySQL可以确定该行是否符合WHERE 条件 。如果该行匹配(必须更新),则MySQL会再次读取该行,这一次 InnoDB 会将其锁定或等待获取锁 。
6、注意
从MySQL 8.0.22开始,DML操作(增删改,通过联接列表或子查询)从MySQL授权表中读取数据,但不对其进行修改,无论隔离级别如何,都不会在MySQL授权表上获得读取锁 。
有关更多信息,请参见Grant Table Concurrency。
四、乐观锁与悲观锁
1、乐观锁
在UPDATE的WHERE子句中加入版本信息来确定修改是否生效
使用乐观锁时仍然需要非常谨慎,因为RR是可重复读的,在UPDATE之前读取版本号,应该使用[当前读],不能使用[快照读]
2、悲观锁
在UPDATE执行前,SELECT后面加上FOR UPDATE来给记录加锁,保证记录在UPDATE前不被修改 。SELECT ... FOR UPDATE是加上了X锁,也可以通过SELECT ... LOCK IN SHARE MODE加上S锁,来防止其mysql幻读怎么处理他事务对该行的修改 。
3、无论是乐观锁还是悲观锁,使用的思想都是一致的 , 那就是当前读 。乐观锁利用当前读判断是否是最新版本,悲观锁利用当前读锁定行 。
五、总结
1、RC级别没有范围锁一定会导致不可重复读和幻影行
2、RR级别安全性更高,实现可重复读的方式为快照,如果需要最新数据可以选择[当前读],因此RR级别是首选
3、不论RR还是RC级别,增、删、改的操作都会进行一次[当前读]操作,以此获取最新版本的数据,并检测是否有重复的索引 。
4、RR级别下 , 当前事务如果未发生更新操作(增删改) , 快照版本会保持不变 , 多次查询读取的快照是同一个
5、RR级别下,当前事务如果发生更新(增删改),会刷新快照,会导致不可重复读和幻影行
6、RR级别下,使用当前读 , 会刷新快照,会导致不可重复读和幻影行
7、RR级别下,可以通过提交当前事务并在此之后发出新查询来为查询获取更新的快照 。
8、RR级别可以部分解决不可重复读和幻读问题
9、其实问题的关键是你的业务逻辑需要可重复读还是最新数据
推荐阅读
- 好游戏推荐射击高画质的,好游戏推荐射击高画质的游戏手游
- 抖音视频号里怎么保存视频,抖音视频号里怎么保存视频呢
- 手机号卡怎么取消办理,手机卡怎么取消注销
- 罗永浩斗鱼直播全程,罗永浩直播间叫什么名字
- 猜数字java游戏代码 javabean猜数字的游戏
- 关于postgresql8.1.11的信息
- 微信视频号直播怎么样设置歌单,微信视频号直播间怎么放音乐
- 车载视频要什么格式的,车载视频什么格式的音质好
- C语言正弦函数怎么求 c语言中计算正弦值