MyBatis-Plus
是通过version
机制实现乐观锁的。
大致思路:
- 取出记录,携带记录的当前
version
; - 更新记录的时候,比较记录当前的
version
是否有改变; - 如果
version
未改变,则更新记录,并更新version
,一般值+1
; - 如果
version
改变了,则不更新记录。
version
机制的核心思想就是,假设发生并发冲突的几率很低,只有当更新数据的时候采取检查是否有冲突,而判断是否有冲突的依据就是version
的值是否被改变了。
配置
MyBatis-Plus
中配置乐观锁分两步:
- 实例化
OptimisticLockerInnerInterceptor
,并添加到MyBatis-Plus
的拦截器链中; - 定义
version
字段,并在Entity
中使用@Version
注解注释version
字段。
说明:
支持的数据类型只有:
int
、Integer
、long
、Long
、Date
、Timestamp
、LocalDateTime
;整数类型下
newVersion = oldVersion + 1
;
newVersion
会回写到entity
中;仅支持
updateById(id)
与update(entity, wrapper)
方法;在
update(entity, wrapper)
方法下,wrapper
不能复用!!!
配置如下:
首先,实例化OptimisticLockerInnerInterceptor
,并添加到拦截器链中:
@Configuration
public class MyBatisPlusConfig {
/**
* 插件配置
*
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 添加乐观锁拦截器
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()