深入理解乐观锁与悲观锁数据库管理系统中的并发控制的任务是确保在多个事务同时进行存取数据库中同一数据时正确执行。
乐观并发控制和悲观并发控制是主要技术手段。memcache、hibernate、tair都有类似概念???
悲观锁利用数据库本身提供的锁机制来实现(但不要把乐观锁和悲观锁与数据库中的行锁、表锁、排他锁、共享锁???混为一谈)
悲观锁Pessimistic Concurrency Control
对数据被外界修改保持悲观态度,在整个数据处理过程中,数据处于锁定状态。如果一个事务执行的操作对某行数据应用了锁,那只有当这个事务把锁释放,那么其他事务才能够执行。
具体流程:
对任意记录修改前,现场是为该记录添加排他锁(exclusive locking)
如果加锁失败说明数据正在被修改,那么当前查询可能要等待或者抛出异常,具体头开发者决定,如果加锁成功那么就可以对记录进行修改,事务完成后解锁。
优点与不足:
悲观锁是“先取锁再访问”的保守策略,位数据处理的安全提供保证。但是在效率方面,加锁机制会让数据库产生额外的开销,会有增加死锁的机会???;另外只读型事务不会产生冲突,也没有必要使用锁,只会加重系统负担;降低了并行性,必须等待解锁。
乐观锁
乐观锁假设用户处理事务不会互相影响,各个事务能够在不加锁的情况下处理各自影响的那部分数据。在提交更新之前,每个事务会先检查该事务在读取数据后有没有其他事务又修改了数据。如果有的话,正在提交的事务进行回滚。一般实现方式是记录数据版本(可用版本号或者时间戳)。在提交时,判断数据库表对应记录的版本与第一次取出来的是否相等,相等则更新。
优点与不足
乐观锁相信数据竞争的概率比较小,因此,尽可能做下去。不会发生任何锁和死锁。但如果做简单这么做,会有不可预期的后果,比如两个事务都都去了数据库的某一行,经过修改以后写回数据库,就出现了问题。???