ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
乐观锁介绍:(乐观锁主要用于抢红包,淘宝抢购,秒杀之类) 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。那么如何实现乐观锁呢,一般来说有以下2种方式: 1. 使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。 何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。 version版本号怎么确定? 在linux中:每个key操作时,都有版本号。 |操作一|操作二| |--|--| |初始版本为一|初始版本为一| |watch age<br/>multi|| ||set age 18<br/>版本加一,这时候数据版本为二<br/>这个自动提交,不加入事务| |set age 20<br/>exec|| |当前操作的记录版本为一,小于实际的数据版本,提交失败<br/>|| 如图:其他客户端提交数据一次数据库版本号version就进行更新一次,本次事务提交的时候对比版本号(会记录提交数据之前的版本情况),要是此次提交的数据版本号,低于数据库当前的版本号,就会提交失败; 读取数据时,将version字段的值一同读出,数据每更新一次,此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次读取出时候版本的version值,相互进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则被更新的数据会被认为是过期的数据。 用下面的一张图来说明: ![](https://box.kancloud.cn/7162ebc922b05b1b9d5ce6883f97f3f0_741x499.png) 如上图所示,如果更新操作顺序执行,则数据的版本(version)会依次递增,不会产生冲突。但是如果发生有不同的业务操作对同一版本的数据进行了修改,那么,先提交的操作(图中B)会把数据version更新为2,当A在B之后提交更新时发现数据的version已经被修改了,那么A的更新操作就会失败。 2. 乐观锁定的第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。