随笔 - 91,  文章 - 0,  评论 - 3,  阅读 - 47581

乐观锁:十分乐观。总是认为不会出现问题,无论干什么也不上锁,出了问题再次更新测试。

悲观锁:十分悲观。总是认为会出问题,无论干什么都会上锁,再去操作。

乐观锁实现方式:

·取出记录时,获取当前version

·更新时带上version

·执行更新时,set version=newVersion where version=oldVersion

·如果version不对,就更新失败

如:

--A
update user set name="abc",version=version+1
where id=2 and version =1

--B  比A先完成更新,这时version=2会导致A修改失败
update user set name="abc1",version=version+1
where id=2 and version =1

乐观锁插件:

①给数据库增加version字段

②实体类加对应字段

@Version //乐观锁version注解
private int version;

③注册组件 

建一个配置类

复制代码
package com.example.demo.config;

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

//扫描mapper文件夹
@MapperScan("com.example.demo.mapper")
@EnableTransactionManagement//开启事物
@Configuration//配置类
public class MyBatisPlusConfig {
    //注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}
复制代码

④测试

成功:

复制代码
@Test
    public void testOptimisticLocker(){
        //查询用户信息
        User user = userMapper.selectById(1);
        //修改用户
        user.setName("abc");
        user.setEmail("abc@163.com");
        //执行更新操作
        userMapper.updateById(user);//UPDATE user SET name=?, age=?, email=?, update_time=?, version=? WHERE id=? AND version=? 
    }
复制代码

更新前

 

 

更新后

 

 

 失败:

复制代码
//测试乐观锁失败!多线程
    @Test
    public void testOptimisticLocker2(){
        //线程1
        User user1 = userMapper.selectById(1);
        user1.setName("abc2");
        user1.setEmail("abc2@163.com");

        //线程2 模拟另外一个线程执行了插队操作
        User user2 = userMapper.selectById(1);
        user2.setName("abc1");
        user2.setEmail("abc1@163.com");
        //执行更新操作
        userMapper.updateById(user2);
        userMapper.updateById(user1);
    }
复制代码

更新前:

 

 更新后:

 

posted on   飞飞乐园  阅读(39)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示