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