引言 php
悲观锁和乐观锁指的并非一种锁,而是一种思想,一种并发控制的方法。html
在事务并发执行的情景中,可能存在多个用户同时更新同一条数据的状况,这可能会产生冲突致使丢失更新或者脏读。数据库
1、悲观锁 缓存
在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它能够阻止一个事务以影响其余用户的方式来修改数据。若是一个事务执行的操做读某行数据应用了锁,那只有当这个事务把锁释放,其余事务才可以执行与该锁冲突的操做。悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。安全
悲观并发控制其实是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。可是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增长产生死锁的机会;另外,在只读型事务处理中因为不会产生冲突,也不必使用锁,这样作只能增长系统负载;还有会下降了并行性,一个事务若是锁定了某行数据,其余事务就必须等待该事务处理完才能够处理那行数据。(摘抄自维基百科)并发
2、乐观锁 大数据
在关系数据库管理系统里,乐观并发控制(又名“乐观锁”,Optimistic Concurrency Control,缩写“OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务可以在不产生锁的状况下处理各自影响的那部分数据。在提交数据更新以前,每一个事务会先检查在该事务读取数据后,有没有其余事务又修改了该数据。若是其余事务有更新的话,正在提交的事务会进行回滚。spa
乐观并发控制多数用于数据争用不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,所以能够得到比其余并发控制方法更高的吞吐量。(摘抄自维基百科)日志
3、两种锁的使用场景 htm
乐观锁适用于读状况比较多的场景,写状况很少的状况下,不容易产生冲突,不加锁会增大数据库系统的吞吐量。
悲观锁适用于写状况比较多的场景,写状况多冲突也容易发生,保守一些比较好,尽管会减少吞吐量,但总比引发冲突。
4、乐观锁的两种实现
(1)校验版本号
在事务执行前读取当前数据的版本号(Version)到缓存,当前事务提交前将缓存中的版本号和当前的版本号进行对比,若两个版本号相等则表明当前事务执行期间没有其余事务对数据进行修改,可提交。反之,好吧,我也没搞清楚会怎么样(待更新)
(2)时间戳