乐观锁:十分乐观。总是认为不会出现问题,无论干什么也不上锁,出了问题再次更新测试。
悲观锁:十分悲观。总是认为会出问题,无论干什么都会上锁,再去操作。
乐观锁实现方式:
·取出记录时,获取当前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); }
更新前:
更新后:
所有博客均为自己学习的笔记。如有错误敬请理解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律