主要适用场景
意图:
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
取出记录时,获取当前version 更新时,带上这个version 执行更新时, set version = newVersion where version = oldVersion 如果version不对,就更新失败
乐观锁配置需要2步 记得两步
1.插件配置
spring xml:
spring boot:
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
2.注解实体字段 @Version 必须要!
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class OptimisticLocker implements Serializable {
private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; @TableField("one") private String one; @TableField("two") private Integer two; @TableField("createTime") private LocalDateTime createTime; @Version private Integer version;
}
特别说明:
支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime 整数类型下 newVersion = oldVersion + 1 newVersion 会回写到 entity 中 仅支持 updateById(id) 与 update(entity, wrapper) 方法 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
示例
示例Java代码(参考test case
代码)
OptimisticLocker o = new OptimisticLocker(); o.setId(1); o.setVersion(1); o.setTwo(2); return testService1.update(o);
示例SQL原理
update tbl_user set name = 'update',version = 3 where id = 100 and version = 2
Version 不用手动增加,只需要在更新时,保证是最新的版本数据就行,这样可以保证数据的一致性,但是也增加了业务自身尝试的次数。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦