参考:【进阶之路】Mybatis-Plus中乐观锁@version注解的问题与解决方案
重点:springboot整合mybatisplus使用乐观锁插件(八)—@Version
配置
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
实体类 字段是integer类型,数据库也要有这个字段
package com.yymt.entity.zaxq;
import com.baomidou.mybatisplus.annotations.*;
import com.baomidou.mybatisplus.enums.FieldFill;
import com.baomidou.mybatisplus.enums.FieldStrategy;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 实有人口信息表
*
* @author xielin
* @date 2021-01-05 21:17:35
*/
@TableName("tb_real_people")
@ApiModel("实有人口信息表")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ZaxqRealPeopleEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Version
private Integer version;
/**
* id
*/
@TableId
private Long id;
/**
* 数据状态,有效性,1:有效 0:无效,用于处理原库删除数据问题,默认1
*/
@TableLogic(value = "1", delval = "0")
private String sjzt;
/**
* 姓名首字母
*/
private String initials;
/**
* 所属小区id
*/
private Long communityId;
/**
* 图片地址
*/
@TableField(strategy = FieldStrategy.IGNORED)
private String imagePath;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
一定要设置Version,不然不生效。version会自动在该版本上加1
@PutMapping(value = "/testJson")
@ApiOperation(value = "testJson")
public R testJson2() {
zaxqRealPeopleService.updateById(new ZaxqRealPeopleEntity().setId(19692L).setXm("testJson2").setVersion(2));
return R.ok();
}
生成的sql
UPDATE tb_real_people SET version=3, xm='testJson2', image_path=null, update_time='2021-08-12 20:28:57.29'
WHERE id=19692 and version=2 AND sjzt='1';
for update 悲观锁 如果查询条件会走索引才是行锁,否则会锁全部,性能差。
重试机制