2021-12-30 mysql 隔离级别

2021-12-30 mysql 隔离级别,第1张

2021-12-30 mysql 隔离级别

可重复读 https://www.cnblogs.com/myseries/p/10931595.html 这篇文章写得很好,可以看下

下面说下个人理解
mysql 的隔离级别
读未提交:

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

在A事务开启后,查询出来的数据 (第一次查询), 然后在B事务中对A中查询的数据进行更改,并提交事务,此时A中再次进行查询(第二次查询),发现数据被改了(事务B改的),在A事务中,同一个事务两次查询数据不一致,即不可重复读.虽然不一致,但是B事务确实提交了,而且读取到的是已提交的事务的结果, 对吧? 所以从根本上来说,不可重复读没有问题,那么这样会导致什么问题呢?为什么mysql的默认隔离级别不是这个??
主要是这种隔离级别不满足很多业务场景,例如,我yhk有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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5687511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存