Mysql: 既然可重复读RR事务隔离解决了幻读问题,那么serializable隔离相对于RR隔离有啥好处?
Mysql: 既然可重复读RR事务隔离解决了幻读问题,那么serializable隔离相对于RR隔离有啥好处?
Repeatable read
能解决幻读?
可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB
默认级别。在SQL
标准中,该隔离级别消除了不可重复读,但是还存在幻象读。
innodb的读分为快照读和当前读。
RR级别下,
普通的select是快照读;select in share mode 和 update是当前读;
当前读和当前读是不会有幻读的。快照读和快照读是不会有幻读的。
但是当前读和快照读,是可能有幻读的。所以产生了程淇铭测试的情况。
Serializable级别下,
select也会默认采用加锁的方式,因此相当于都是当前读。
总结:
在RR级别下,需要程序员主动避免事务中有快照读和当前读的交替,才可以避免幻读。
在Serializable级别下,都是当前读了,自然不回产生幻读。
15 回答8.4k 阅读
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
对于一般业务来说没啥好处,反而对性能有影响,对于特殊业务来说就比较方便
RR 解决幻读是通过手动加锁来实现的,如果加锁不正确,还是会出现幻读,在不进行全表锁的情况下,很难避免其他事务不会对当前事务有影响。
所以,
serializable
的好处就是完全隔绝了其他事务对当前事务的影响,在开发人员对数据库理解不够的时候,使用serializable
比手动加锁要安全