您的位置:首页 > 数据库

数据库锁机制

2016-08-13 22:05 127 查看

共享锁和排他锁

共享锁
S锁
,又称为读锁,若事务T对数据对象A加上S锁,则事务T可以读取A但不能修改A,其他事务只能再对A加S锁,而不能加排他锁
X锁
,直到T释放A上的S锁。这保证了其他事务可以读A,并且在T释放A上的S锁之前不能对A做任何更新。

排他锁
X锁
,又称为写锁,若事务T对数据对象A加上X锁,则事务T可以读取A,也可以修改A,但是其他事务不能对数据对象A加任何锁

共享锁只用于表级,排他锁用于行级

数据库死锁的原因:若干事务相互等待对方释放锁,就会陷入无限等待状态,系统进入死锁

悲观锁和乐观锁

注意这里的悲观锁乐观锁与上面说的共享锁排他锁是不互斥的,这里的悲观乐观锁更多的强调加锁的力度和时机。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁假定其他用户企图访问或者改变你正在访问、改变的对象的概率很高,在悲观锁环境中,在改变对象之前就将对象锁住,直到提交所作的更改后才释放锁。悲观锁不论是行锁还是页锁,加锁的时间都比较长,这样会限制其他用户的访问,也就是说悲观锁的并发性不好。

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁无法解决数据脏读的问题。乐观锁认为用户企图改变你的正在更新的对象概率很小,因此乐观锁直到你准备提交所作更改时才将对象锁住,当你读取以及更改对象时加不锁。因此乐观锁加锁的时间更较悲观锁更短,可以获得更好的并发访问性能。如果第二个用户恰好在第一个用户提交更改之前读取了该对象(即脏读),那么当他完成了自己的更改进行提交时,数据库就会发现该对象已经变化了,要求第二个用户重新读取该对象并作出更改。这说明在乐观锁环境中,会增加并发用户读取对象的次数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: