日期:2014-05-16  浏览次数:20457 次

数据库的隔离级别 小结

概述

本文综合了以下三篇帖子的内容,并汇总:

http://baike.baidu.com/view/2943500.htm 对“更新丢失”的描述不到位,在“解决方案”中错误地使用了“瞬间共享读锁”和“共享读锁”。

http://blog.csdn.net/w_l_j/article/details/7354530 没有提到“更新丢失”的情况,在READ UNCOMMITTED中没有提到其保证不出现更新丢失。隔离级别的翻译较繁体的意译更直观

http://en.wikipedia.org/wiki/Isolation_(database_systems) 英文维基,一贯得准确和可靠。中文版“隔離級別與鎖定”(Isolation Levels vs Locks)一节是错误的,我试着改了下。


待解决的问题:

对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:  

  • 更新丢失(Lost update):对于并发更新同一条记录的两个事务 T1, T2, T1先更新完,T2紧接着更新,却又因故回滚,数据因此回到了T1和T2操作前的状态。由于没有引入排他写锁,T1中途写入的内容便丢失了。
  • 脏读(Dirty Reads): 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的。
  • 不可重复读(Non-repeatable Reads):
  1. 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了. 
  2. 幻读(Phantom Reads): 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.  


解决问题:

针对上述四种状况,设计了四种隔离级别:

隔离级别 更新丢失 脏读 不可重复读 幻读