当前位置: 首页 > 图灵资讯 > 技术篇> 2021-12-30 mysql 隔离级别

2021-12-30 mysql 隔离级别

来源:图灵教育
时间:2023-06-13 09:26:47

让我们谈谈个人的理解 mysql 的隔离级别 读未提交:

可读取其他事务未提交的数据(可读取计算过程数据,而不是最终数据、垃圾数据,可能产生脏读) 不能重复阅读:

A事务打开后,查询的数据 (第一次查询), 然后在B事务中更改A中查询的数据并提交事务。此时,A中再次查询(第二次查询),发现数据已更改(B事务更改)。在A事务中,同一事务的两个查询数据不一致,即不能重复。虽然不一致,但B事务确实提交了,并阅读了已提交的事务的结果, 对吧? 所以从根本上说,不能重复阅读没有问题,那么这会导致什么问题呢?为什么mysql的默认隔离水平不是这样?? 主要原因是这种隔离水平不满足很多业务场景。比如我的银行卡有500元。我点击提现。这时,我的贷款刚刚扣除了200元,所以我提现的结果是300元..????是不是蒙圈??(可重复阅读,虽然还是500,但由于余额不足,执行扣款500时扣款失败。) 还有数据库备份 余额的变化也会伴随着余额明细表的变化,整体上是一件事。假设我们在某个时间点备份数据库,备份程序刚刚备份了余额表,但没有备份涉及余额的表,您提交了事务。所以情况是:当你用这个备份数据恢复数据时,余额是200,但是细节中没有流量记录,这个时候就有问题了。

可重复读: A事务打开后,查询的数据 (第一次查询), 然后在B事务中更改A中查询的数据并提交事务。此时,A中再次查询(第二次查询),发现结果与第一次查询结果一致。在A事务中,同一事务的两次查询数据可以重复; 那么这种隔离水平会有问题吗? 如何更新数据? 比如 A 中央执行事务的数据id从1开始 value为5 ,事务B开始执行,将id为1的value改为4,然后提交事务; 此时,由于隔离级别,A中再次执行查询,id为1 value还是5,此时A事务开始实施修改; set value = 3 where id =1 and value = 5; 这个sql会成功执行吗??

答案是否定的。虽然可以重复读取,读取当前事务开始时的数据,但在执行修改时仍可以读取提交的B事务数据,id =1 and value = 5 在执行修改时,无法查询数据的限定条件; id =1 and value = 4 有限的条件可以成功实施; 会改为3

串行化: 可以理解为每个事务共用一把锁,所有事务都排队执行,效率太低

上一篇:

Thymeleaf的属性2

下一篇:

Java注解的学习