MySQL乐观锁

乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。

版本号

读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

update tb_goods   
set status=2,version=version+1  
where id=#{id} and version=#{version}; 

时间戳

时间戳机制,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

条件限制

举个例子,当电商抢购活动时,大量并发进入,如果仅仅使用版本号或者时间戳,每次只会有一个用户扣减成功,不可避免的人为造成失败。
num-#{buyNum}>=0 ,这个情景适合不用版本号,只更新时做数据安全校验,适合库存模型,扣份额和回滚份额,性能更高。

UPDATE tb_goods
SET num = num - #{buyNum} 
WHERE
    id = #{id} 
AND num - #{buyNum} >= 0 
AND STATUS = 1

乐观锁的更新操作,最好用主键或者唯一索引来更新,这样是行锁,否则更新时会锁表。

posted @ 2020-07-16 11:58  wesson2019  阅读(515)  评论(0编辑  收藏  举报