Mysql: 既然可重复读RR事务隔离解决了幻读问题,那么serializable隔离相对于RR隔离有啥好处?

Mysql: 既然可重复读RR事务隔离解决了幻读问题,那么serializable隔离相对于RR隔离有啥好处?

阅读 2.9k
4 个回答

对于一般业务来说没啥好处,反而对性能有影响,对于特殊业务来说就比较方便

RR 解决幻读是通过手动加锁来实现的,如果加锁不正确,还是会出现幻读,在不进行全表锁的情况下,很难避免其他事务不会对当前事务有影响。

所以,serializable的好处就是完全隔绝了其他事务对当前事务的影响,在开发人员对数据库理解不够的时候,使用serializable比手动加锁要安全

Repeatable read能解决幻读?
可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读。

可重复读解决不了幻读啊。又没有添加行间锁。
如果一次事务中不需要范围查询或者范围更新,那么可重复读其实已经可以了。

innodb的读分为快照读和当前读。

RR级别下
普通的select是快照读;select in share mode 和 update是当前读;
当前读和当前读是不会有幻读的。快照读和快照读是不会有幻读的。
但是当前读和快照读,是可能有幻读的。所以产生了程淇铭测试的情况。

Serializable级别下
select也会默认采用加锁的方式,因此相当于都是当前读。

总结
在RR级别下,需要程序员主动避免事务中有快照读和当前读的交替,才可以避免幻读。
在Serializable级别下,都是当前读了,自然不回产生幻读。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题