数据库锁机制

来源:互联网 发布:淘宝上秒杀活动在哪里 编辑:程序博客网 时间:2024/06/03 18:51

共享锁和排他锁

共享锁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加任何锁

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

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

悲观锁和乐观锁

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

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

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

0 0