设置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 2022-12-15 10:39  bigstrong_code  阅读(96)  评论(0编辑  收藏  举报

导航