Bloqueo optimista y pesimista
Cerradura optimista: muy optimista, piensa siempre que no habrá problemas, no importa lo que hagas, no te irás a cerrar. Si hay algún problema, actualice la prueba de valor nuevamente.
Cerradura pesimista: Muy pesimista, piensa que siempre hay problemas, no importa lo que hagas, ve a cerradura. Adelante y opere.
Cuando desee actualizar un registro, espere que otros no hayan actualizado este registro.
Implementación de bloqueo optimista:
- Al buscar el registro, obtenga la versión actual
- Al actualizar, traiga esta versión
- Al realizar una actualización, establezca version = newVersion donde version = oldVersion
- Si la versión es incorrecta, la actualización falla.
-- 多线程下 锁的处理
-- 乐观锁: 1. 先查询,获取版本号 version = 1
-- A 线程
update user set name = 'jack', version = version + 1
where id = 1 and version = 1
-- B 线程抢先完成,这个时候 更新version为 2,会导致A 修改失败
update user set name = 'jack', version = version + 1
where id = 1 and version = 1
solución
-
Agregue el campo de versión en la tabla, tipo int, el valor predeterminado es 0
-
En la medida en que la última versión del complemento sea 3.4.1, el complemento debe agregarse al interceptor. No inyectar frijoles.
新版:OptimisticLockerInnerInterceptor
在3.4.1 中块过时的: OptimisticLockerInterceptor
- Agregue @Version al campo de versión para resolver.
código
package cn.bitqian.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* mybatis plus配置类
* @author echo lovely
* @date 2020/11/15 09:48
*/
@EnableTransactionManagement // 开启事务
@MapperScan("cn.bitqian.mapper")
@Configuration
public class MyBatisPlusConfig {
// mybatis插件注册
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 乐观锁
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
// 添加乐观锁到插件中
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
Es necesario agregar un campo
prueba
@Test
void testOptimisticLocker1() {
User user = userMapper.selectById(1327447426226786310L);
// 抢先修改
User user1 = userMapper.selectById(1327447426226786310L);
user1.setName("jjj");
userMapper.updateById(user1);
// 不会被修改,因为由于上面的修改version变了
user.setName("bitqian666");
userMapper.updateById(user);
}