不可重复读与幻影读的区别
并发一致性问题
- 1.修改丢失
- 2.读脏数据
- 3.不可重复读
- 4.幻影读
区别
从控制的角度来讲,不可重复读只需要锁住满足条件的记录(可能只有一行),而幻影读要锁住满足条件的及其相近的记录(是一个范围)。所以,避免幻读,必须锁住表,避免不可重复读,只需要锁住行。
不可重复读和幻读最大的区别在于,如何通过锁的机制来解决它们产生的问题。
可以采用悲观锁的机制来处理问题,悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。所以出于性能的考虑,成熟的数据库使用了以乐观锁为理论基础的MVCC(多版本并发控制)来避免上述两种问题。
乐观锁,大多是基于数据版本记录机制实现的。
1.SELECT : 当开始一个新事务时,该事务的版本号肯定会大于当前所有数据行快照的创建版本号。
2.INSERT : 将当前系统版本号作为数据行快照的创建版本号。
3.DELETE : 将当前系统版本号作为数据行快照的删除版本号。
4.UPDATE : 可以理解为先执行 DELETE 后执行 INSERT。