数据库的隔离机制

最近学习了一下数据库的隔离机制,在此做一个简单的总结,和大家一起分享,有不正确的地方欢迎指正。参考文献在文章末尾做了引用,如果涉及到侵权,请联系我。

1、并发环境下数据库可能出现的四种情况:

(1)丢失更新:两个事务同时对同一份数据进行修改,其中一个事务的修改被另外一个事务覆盖;

(2)脏读:事务a对资源t进行了更新,事务b读到了更新后的t,但事务a却rollback导致更新无效(此时b读到的t是脏的);

(3)不可重复读:事务a读取资源t,在a结束之前,多次读取t的结果应该是一致的。如果在a多次读取t的间隔中,事务b更新了t,就会导致a多次读取的内容不一致;

(4)幻读:在一个事务中多次读取记录,却因为其他事务的修改,导致多次读取的结果不一致。(听起来和“不可重复读”差不多,实际完全是两回事,比如,事务a读取库中value=5的记录数目,第一次读可能查到6条,这时事务b又插入了一条,事务a再次读就变成了7条;和(3)的区别在于幻读不涉及到共享资源的争夺(事务b可能是新插入记录或删除记录))。

2、数据库中的两种锁:排它锁、共享锁

锁机制可以解决共享资源的争夺问题。

(1)排它锁:又称为写锁(x)。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其它事务在T释放A上的锁之前不能再读取和修改A。

(2)共享锁:又称为读锁(s)。若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其它事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

3、封锁协议

对什么时候申请X锁或S锁、持锁时间、何时释放做一些规则和限制,共有三级封锁协议,不同的封锁协议可以解决的并发问题也不一样。

在文章下面的引用中对三种协议的概念做了详细的阐述,在此不做赘述,直接给出三种协议可以解决的问题。

(1)一级封锁协议:可以解决“丢失更新”的问题;

(1)二级封锁协议:解决“丢失更新”和“脏读”;

(1)三级封锁协议:解决“丢失更新”、“脏读”、“不可重复读”;

提醒:在看三种协议的概念时,请特别注意锁的释放时间。

4、隔离机制

隔离机制为程序员节省了许多时间,不需要自己去实现封锁协议,主要有以下四种机制,不用的机制解决不同程度的并发问题:

(1)ReadUnCommitted:实现了一级封锁协议

(2)ReadCommitted:实现了二级封锁协议

(3)RepeatableRead:实现了三级封锁协议

(4)Serializable:在三级协议的基础上做了补充,限制的更加严格,主要解决了“幻读”的问题(其它三种问题当然也都解决了)。

建议大家对各种协议的实现过程做一些了解,下面的引用写的很全面:

http://www.cnblogs.com/zhenyulu/articles/330494.html

另外,对并发环境下的四种问题,可以参考以下文章(对封锁协议和隔离机制的讲解,建议参考上面的链接):

http://comedsh.iteye.com/blog/698733

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值