设置MySql事务隔离级别的坑

结论

设置MySql会话级别事务隔离级别时需要先设置当前会话的事务隔离级别,然后再开启事务,否则新开启的事务隔离级别不是新设置的,而是之前的。

验证过程

1. 查看当前会话的隔离级别

2. 开启事务

3. 设置RC事务隔离级别

4. 其中一个事务更新数据,观察另外一个事务是否可以读取到最新数据

5. 不能读取到,证实还是之前RR隔离级别

6. 再次重新开启事务

7. 其中一个事务更新数据,观察另外一个事务是否可以读取到最新数据

8. 能读取到,证实是RC隔离级别

RC和RR隔离级别实现原理

MySQL 中的提交读和可重复读两个隔离级别是使用多版本并发控制 MVCC 来实现的,而不是通过添加读写锁来实现的,如果通过读写锁来实现隔离级别的话,只有读读可以并发,读写,写读,写写都不能并发,这样数据库的并发度太低了,所以一般不通过加读写锁来实现隔离级别。而如果使用 MVCC 来实现 提交读和可重复读两个隔离级别的话则可以在读的时候不加锁,读写和写读可以同时进行,只有写写需要阻塞,这样就极大地提高了并发度。

MVCC 机制会记录每行数据的历史版本,通过可见性算法、undo 日志以及 read view 控制每个读操作所读取的行数据历史版本,

Repeatable Read 在事务发生第一次读的时候选定所要读取的数据行的版本,整个事务都读取这一个版本的数据行,所以可以重复读,每次读取的数据都一致。

Read Committed 在事务中每次读操作都是读取最新的行数据版本,而这最新的数据行版本很可能是某个事务进行了修改操作后提交的,所以可能会发生多次读取同一行数据,但是前后读取的数据不一致的情况。这就是不可重复读现象,所以提交读不能避免不可重复度现象。

想要详细了解MVCC是如何实现事务隔离的,可以阅读这篇博客, MySQL中MVCC的正确打开方式(源码佐证),写的非常好,强力推荐。

posted on   bigstrong_code  阅读(99)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示