在关系数据库管理系统里,乐观并发控制(又名”乐观锁”,Optimistic Concurrency Control,缩写”OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务可以在不产生锁的状况下处理各自影响的那部分数据。在提交数据更新以前,每一个事务会先检查在该事务读取数据后,有没有其余事务又修改了该数据。若是其余事务有更新的话,正在提交的事务会进行回滚。乐观事务控制最先是由孔祥重(H.T.Kung)教授提出。数据库
乐观并发控制的事务包括如下阶段:
1. 读取:事务将数据读入缓存,这时系统会给事务分派一个时间戳。
2. 校验:事务执行完毕后,进行提交。这时同步校验全部事务,若是事务所读取的数据在读取以后又被其余事务修改,则产生冲突,事务被中断回滚。
3. 写入:经过校验阶段后,将更新的数据写入数据库。缓存
乐观并发控制多数用于数据争用不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,所以能够得到比其余并发控制方法更高的吞吐量。安全
相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。通常的实现乐观锁的方式就是记录数据版本。并发
数据版本,为数据增长的一个版本标识。当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。当咱们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的版本标识进行比对,若是数据库表当前版本号与第一次取出来的版本标识值相等,则予以更新,不然认为是过时数据。性能
实现数据版本有两种方式,第一种是使用版本号,第二种是使用时间戳。 使用版本号实现乐观锁事务
使用版本号时,能够在数据初始化时指定一个版本号,每次对数据的更新操做都对版本号执行+1操做。并判断当前版本号是否是该数据的最新的版本号。同步
使用版本号时,能够在数据初始化时指定一个版本号,每次对数据的更新操做都对版本号执行+1操做。并判断当前版本号是否是该数据的最新的版本号。it
乐观并发控制相信事务之间的数据竞争(data race)的几率是比较小的,所以尽量直接作下去,直到提交的时候才去锁定,因此不会产生任何锁和死锁。但若是直接简单这么作,仍是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,通过修改之后写回数据库,这时就遇到了问题。io
在关系数据库管理系统里,悲观并发控制(又名”悲观锁”,Pessimistic Concurrency Control,缩写”PCC”)是一种并发控制的方法。它能够阻止一个事务以影响其余用户的方式来修改数据。若是一个事务执行的操做读某行数据应用了锁,那只有当这个事务把锁释放,其余事务才可以执行与该锁冲突的操做。效率
悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。
悲观并发控制其实是”先取锁再访问”的保守策略,为数据处理的安全提供了保证。可是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增长产生死锁的机会;另外,在只读型事务处理中因为不会产生冲突,也不必使用锁,这样作只能增长系统负载;还有会下降了并行性,一个事务若是锁定了某行数据,其余事务就必须等待该事务处理完才能够处理那行数
乐观锁适用于多读的应用类型,这样能够提升吞吐量,像数据库若是提供相似于write_condition机智的其实都是提供的乐观锁。 相反,若是常常发生冲突,上层应用会不断进行 retry,这样反而下降了性能,因此这种状况下用悲观锁比较合适。