主要适用场景
意图:
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:取出记录时,获取当前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 不用手动增加,只需要在更新时,保证是最新的版本数据就行,这样可以保证数据的一致性,但是也增加了业务自身尝试的次数。