数据库:乐观锁与悲观锁
2017-09-07 15:50
405 查看
数据库管理系统中的并发控制的任务就是确保多个事务同时存取数据库中同一数据时不破坏事务的隔离性以及数据库的统一性
悲观锁:假设会发生冲突,屏蔽一切可能违反数据完整性的操作
即当事务在操作数据时把这部分数据进行锁定,直到操作完毕再解锁,其他事务操作才可操作该部分数据。
实现:大多是情况下依靠数据库的锁机制实现。
一般使用
语句锁定了account 表中所有符合检索条件(name=”Max”)的记录。
本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。
优点:为数据安全提供保证
缺点:并发量大的时候性能差;处理加锁的机制会让数据库产生额外的开销;有可能出现死锁
乐观锁:假设不会发生冲突,只在提交操作时检查是否违反数据完整性
实现:大多基于数据版本version记录机制实现
具体可通过给表加一个版本号或时间戳字段实现,当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断当前版本信息与第一次取出来的版本值大小,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据,拒绝更新,让用户重新操作。
优点:不会产生死锁
缺点:产生冲突的几率大
总结:
乐观并发控制多数用于数据争用不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。
悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。
另外,什么是死锁?
当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。
悲观锁:假设会发生冲突,屏蔽一切可能违反数据完整性的操作
即当事务在操作数据时把这部分数据进行锁定,直到操作完毕再解锁,其他事务操作才可操作该部分数据。
实现:大多是情况下依靠数据库的锁机制实现。
一般使用
select ...for update对所选择的数据进行加锁处理,例如
select * from account where name=”Max” for update, 这条sql
语句锁定了account 表中所有符合检索条件(name=”Max”)的记录。
本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。
优点:为数据安全提供保证
缺点:并发量大的时候性能差;处理加锁的机制会让数据库产生额外的开销;有可能出现死锁
乐观锁:假设不会发生冲突,只在提交操作时检查是否违反数据完整性
实现:大多基于数据版本version记录机制实现
具体可通过给表加一个版本号或时间戳字段实现,当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断当前版本信息与第一次取出来的版本值大小,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据,拒绝更新,让用户重新操作。
优点:不会产生死锁
缺点:产生冲突的几率大
总结:
乐观并发控制多数用于数据争用不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。
悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。
另外,什么是死锁?
当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。
相关文章推荐
- web开发中的两把锁之数据库锁:(高并发--乐观锁、悲观锁)
- 关系型数据库表结构设计技巧 - 物理主键、悲观锁、乐观锁
- 数据库中乐观锁与悲观锁的概念
- 数据库事务的悲观锁和乐观锁
- 数据库并发控制 你选乐观锁还是悲观锁?
- 数据库事务隔离级别与锁 悲观锁 乐观锁
- 数据库中乐观锁与悲观锁的概念
- 在数据库中,并发控制有乐观锁和悲观锁之间,什么时候用乐观锁比较好什么时候用悲观锁比较好?
- 【数据库】悲观锁与乐观锁与MySQL的MVCC实现简述
- 数据库中乐观锁与悲观锁的概念
- 数据库之乐观锁和悲观锁篇
- 数据库的悲观锁和乐观锁
- 数据库的乐观锁 悲观锁
- 数据库乐观锁和悲观锁的一些理解
- 数据库中的乐观锁和悲观锁
- 数据库乐观锁与悲观锁
- 在数据库中,并发控制有乐观锁和悲观锁之间,什么时候用乐观锁比较好什么时候用悲观锁比较好?
- 对数据库锁的理解“悲观锁”AND“乐观锁”
- 【数据库】乐观锁与悲观锁
- 数据库悲观锁和乐观锁