MyBatis-Plus implementa el bloqueo optimista

MyBatis-Plus implementa el bloqueo optimista

El bloqueo optimista es relativo al bloqueo pesimista. El bloqueo optimista supone que los datos no causarán conflictos en general, por lo que cuando los datos se envían y actualizan, el conflicto de datos se detectará formalmente. Si se encuentra un conflicto, permita que el usuario devuelva el error. información, dejar que el usuario decida qué hacer.

Rol: El bloqueo optimista es para resolver el problema de los conflictos de actualización de datos en el proceso concurrente El bloqueo optimista puede mejorar el rendimiento del programa en el proceso concurrente.

1. Control de número de versión

El bloqueo optimista se implementa mediante el mecanismo de registro de versión, que es la implementación más utilizada del bloqueo optimista. ¿Qué es una versión de datos? La versión de datos se refiere específicamente a agregar un identificador de versión a los datos. Generalmente, se realiza agregando un campo numérico de "versión" a la tabla de la base de datos. Al leer los datos, el valor del campo de versión se lee junto y los datos se actualiza cada vez. , la versión se incrementa en 1. Cuando enviamos la actualización, compare la información de la versión actual del registro correspondiente en la tabla de la base de datos con el valor de la versión recuperado por primera vez.Si el número de versión actual del registro de datos es igual al valor de la versión recuperado por primera vez, actualizarlo, de lo contrario se considerará como dato caducado y no se actualizará.

Como se muestra en la figura anterior, si las operaciones de actualización se realizan de forma secuencial, la versión de los datos se incrementará de forma secuencial y no se producirá ningún conflicto. Sin embargo, si hay diferentes operaciones comerciales que modifican la misma versión de los datos, la operación enviada primero (B en la figura) actualizará la versión de datos a 2. Cuando A envía la actualización después de B, encuentra que la versión de la se han modificado los datos. , la operación de actualización de A fallará.


2. ¿Cómo implementar el bloqueo optimista?

@VersionLa anotación marca el bloqueo optimista y el campo de versión se usa para garantizar la seguridad de los datos. Al modificar los datos, la versión se usará como una condición y la modificación será exitosa solo cuando se establezca la condición.

  • Al buscar un registro, obtener la versión actual
  • Al actualizar, traer esta versión
  • Al realizar una actualización,update tableName set version = oldVersion + 1 where version = oldVersion
  • Si la versión es incorrecta, la actualización falla

1. Agregue el campo de versión a la tabla de la base de datos y establezca el valor predeterminado en 1;

La información de la tabla de datos MySQL-User es la siguiente:

2. Agregue el atributo de versión a la clase de entidad y agregue @Versionanotaciones ;

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor

public class User {
    
    
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    //乐观锁
    @Version
    private Integer version;
    //字段添加填充内容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

3. Registrar la clase de configuración (componente);

//扫描我们的repository文件夹
@MapperScan("com.trainingl.repository")
@EnableTransactionManagement
@Configuration  //配置类
public class MyBatisPlusConfig {
    
    

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
    
    
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //注册乐观锁插件
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
    
}

4. Prueba de bloqueo optimista;

// 测试乐观锁成功
@Test
public void testOptimisticLock(){
    
    
    //修改用户信息时,先查询用户信息,再进行修改
    //1. 查询用户信息
    User user = userMapper.selectById(1L);
    //2. 修改用户信息
    user.setName("zhangsan");
    user.setAge(36);
    user.setEmail("[email protected]");
    //3. 执行更新操作
    userMapper.updateById(user);
}

Se encuentra en la información de registro de la consola: al modificar los datos, la versión se usa como un juicio condicional y la versión completa automáticamente la operación de autoincremento, a saber: version = version+1.

// 测试多线程下乐观锁失败
@Test
public void testOptimisticLock1(){
    
    
    //线程 1
    User user1 = userMapper.selectById(1L);
    user1.setName("zhangshan");
    user1.setEmail("[email protected]");

    //线程 2(在线程1的修改操作未来得及执行时介入)
    User user2 = userMapper.selectById(1L);
    user2.setName("kuangsan");
    user2.setEmail("[email protected]");
    userMapper.updateById(user2);

    //如果没有乐观锁就会覆盖插队线程的值!
    userMapper.updateById(user1); //更新失败
}

Información de registro del subproceso 1 (actualización exitosa):

Información de registro para el subproceso 2 (actualización fallida):

El bloqueo optimista es adecuado para escenarios con más lecturas y menos escrituras, lo que puede mejorar el rendimiento del programa. El control de concurrencia optimista cree que la probabilidad de carrera de datos entre transacciones es relativamente pequeña, así que hágalo de la manera más directa posible y no bloquee hasta el momento de la confirmación.

Supongo que te gusta

Origin blog.csdn.net/qq_41775769/article/details/123077430
Recomendado
Clasificación