5.乐观锁

suaxi
2021-04-05 / 0 评论 / 37 阅读 / 正在检测是否收录...

乐观锁

乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败


--A线程
update user set name = 'test',version = version + 1
where id = 1 and version = 1;

--B线程(此时如果B线程抢先完成修改操作,则A线程会执行失败)
update user set name = 'test',version = version + 1
where id = 1 and version = 1;


乐观锁插件测试

1.数据库增加version字段,并设置默认值为1

1.数据库增加version字段.png


2.实体类

@Version
private int version;


3.注册组件

package com.sw.mybatisplus.config;

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * @Author suaxi
 * @Date 2021/4/5 11:48
 */
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {

    //注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}


4.单元测试

    @Test
    void update(){
        User user = new User();
        user.setId(11);
        user.setName("自动填充测试");
        user.setAge(30);
        int result = userMapper.updateById(user);
        System.out.println(result);
    }

    //测试乐观锁(成功)
    @Test
    void OptimisticLockerInterceptorTest1(){
        //1.查询用户信息
        User user = userMapper.selectById(10L);
        //2.修改信息
        user.setName("乐观锁测试01");
        //3.执行更新
        userMapper.updateById(user);
    }


    //测试乐观锁(失败)(模拟多线程)
    @Test
    void OptimisticLockerInterceptorTest2(){
        User user = userMapper.selectById(10L);
        user.setName("乐观锁测试111");

        //模拟插队
        User user1 = userMapper.selectById(10L);
        user1.setName("乐观锁测试222");
        userMapper.updateById(user1);

        //自旋锁尝试多次提交
        userMapper.updateById(user);
    }
0

评论 (0)

取消