mysql默认的事物隔离级别

示例MySQL事务隔离级别以及脏读、幻读、不可重复读

说实话,当我第一次了解MySQL的四种隔离级别时,我是绞尽脑汁的。
尤其是脏读、不可重复读、幻读这三个陷阱,简直比面试中被问到SQL语句时更难受。

首先说一个真实的场景:我曾经定制过一个电商平台的库存系统,遇到了这个问题。
用户A发现某一款限量版车型只剩下3 辆了。
结果,用户 B 在 A 下订单之前就抢了四件——这是典型的脏读。
如果系统处理不好,用户A在尾款付款时发现库存不正确,客服电话肯定会被占满。

根据标准,这四个级别划分如下:
无义务阅读。
这个级别简直就是噩梦。
我当时在一个小项目上尝试过,发现事务A只是修改了数据但没有提交,事务B直接读取了。
最后A回滚了,B这边的操作还是基于脏数据。
这种类型的方法直接公开未提交的数据。
如果你仔细想想,它会考虑脏读、不可重复读和幻读。
使用它就像参观游乐园一样。
你不知道什么时候你就会掉进陷阱。

读取提交是一种妥协。
至少保证传输的数据不被读取,避免脏读。
但想一想:当你的事务A第一次读取数据时,它是1 00。
当事务B提交数据时,它变成2 00。
当你的事务A再次读取时,它仍然是1 00。
这是一个不可重复的读操作。
我有一个同事在写报告时就陷入了这个陷阱。
第一次导入数据,销量是一万,但是第二次中间下了大单,报表不见了,老板直接找他说话。
但幻读不是问题。

可重复读是InnoDB的默认级别,也是最常用的。
老实说,这个名字很混乱,但实际上使用起来更方便。
关键是采用了下一键锁定机制,防止幻读。
在开发财务对账系统时,我经常使用它来确保帐号在整个交易过程中保持不变。
比如你查账户余额是1 00,别人在中间加了5 0。
再查一下账户,还是1 00,完美。
但请注意,幻读是无法避免的。
例如,如果您使用范围查询查询余额为1 00元的帐户,而其他人插入另一个余额为1 00元的帐户,您再次检查范围,则会出现额外的条目。

连载更是极端。
我司举办高并发闪购活动。
本来想用这个,但是发现请求的等待时间增加了一倍。
但优点就是绝对安全。
写锁和读锁非常严格,后续事务要等待前一个事务完成。
一位老运维员工表示,这就像超市收银台一样。
您停止扫描并等待下一个人扫描。
扫描完成后不可能没有扫描,数据就会混乱。

InnoDB 很有趣。
虽然标准说可重复读是幻读,但它们实际上是被锁定机制阻止的。
我做性能测试的时候发现,在高并发的情况下,可重复读比序列化快很多,但是偶尔会出现幻读。
后来发现调整锁粒度可以提高。
例如,我有一个项目,使用了“行级锁定+间隙锁定”的组合,这比标准表锁定要好得多。

但是,您选择哪个级别取决于业务场景。
财务系统必须使用序列化,电子商务闪购必须使用读取提交,普通报表必须使用可重复读取。
我帮助一家物流公司建立了一个使用可重复读取的系统。
结果老板觉得数据不能实时获取,最后改成了“读取并发送”——他们说这是大事。

什么是oracle数据库隔离级别

那天晚上我在办公室调试数据库,突然发现查询结果有问题。
我快速打开终端并输入命令,屏幕上立即出现一条消息,指出当前会话的隔离级别是 REPEAT READ。
我的心漏了一下。
我记得今天早上推出了一个新功能。
有什么我没注意到的吗?我快速检查了系统的全局隔离级别并确认这是重复读取。
这让我松了口气,并表明问题可能不在于绝缘水平。

我尝试将当前会话更改为“READ COMMITTED”并按 Enter。
数据库响应很快。
但那一刻我突然想,上周导致报告错误的错误是否也可能与此有关?等等,我立即查看日志,果然,我看到了几个关于MVCC的警告。
这进一步让我相信绝缘水平确实很重要。

我现在坐在椅子上,看着屏幕上显示的隔离级别,突然想到:如果我这个设置不正确,会不会影响其他用户数据的一致性?例如,如果一个用户修改敏感数据,而另一个用户执行脏读,后果将很严重。
我摸着下巴继续看文档,心想,这个RE-READING是怎么实现的?为什么MySQL默认使用这个级别?它真的能完美解决所有并发问题吗?