MySQL乐观锁
概述
- 乐观锁( Optimistic Locking )
- 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做
实现方式
添加额外字段Version
- 使用数据版本(Version)记录机制实现
- 数据版本:即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。
- 当提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据
- compare and swap 先比较一致再更新
// 左侧:按顺序提交,不会发生冲突
// 右侧:version = 1 后,分别有 A B 两个事务读取到了 version = 1 的数据,都对此数据进行修改,B 先于 A 修改完毕并提交,修改完毕后 version = 2 ; A 提交修改操作,A 此时持有的 version = 1 ,但当前的 verison = 2 ,所以 A 事务的操作失败
添加额外字段时间戳
- table中增加一个字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突