数据库中事务的隔离级别 小结

问题:

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

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


解决:

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

隔离级别 更新丢失 脏读 不可重复读 幻读
Read Uncommitted - 可能发生 可能发生 可能发生
Read Committed - - 可能发生 可能发生
Repeatable Read - - - 可能发生
Anomaly Serializable - - - -

READ UNCOMMITTED(允许读到尚未提交的数据)  :  允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现  
READ COMMITED(只能读到已提交数据)  : 只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然会出现  
REPEATABLE READ(事务内重复读同一块数据保持不变) :  确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题依然存在  
SERIALIZABLE(事务逐个串行操作)  : 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可以避免,但性能十分低。

每种隔离级别的实现:

隔离级别 写入锁 读取锁 范围锁
READ UNCOMMITTED V - -
READ COMMITED V S -
REPEATABLE READ V V -
SERIALIZABLE V V V

"V" 排他锁。锁定将持续到事务结束。

"S" 共享锁。一般写锁都是排他的,否则连最低的事务隔离级别都无法保证,会出现更新丢失(Lost update)的情况。读锁有共享读锁和排他读锁之分,两者都要等待对应范围的写锁被释放后才能获取,以避免读到脏数据;区别是S仅在读取完成后即释放,而无需等到事务结束,且支持同时被多个读操作持有(意即共享)。显然前者锁定的粒度更小,因而性能较优。


oracle和mysql对事务隔离级别的支持

Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED   
Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ  


参考

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)一节是错误的,顺手改了下。

http://docs.jboss.org/jbosscache/1.4.0/TreeCache/en/html/transactions.html 5.1.2.1. Isolation levels 写得简单、直观、到位。严重推荐。

http://docs.oracle.com/cd/B19306_01/server.102/b14220/consist.htm oracle官方文档。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值