当前位置: 首页 > news >正文

【Java】mybatis-plus乐观锁-基本使用

乐观锁(Optimistic Locking)是解决并发问题的重要机制。它通过在数据更新时验证数据版本来确保数据的一致性,从而避免并发冲突。与悲观锁不同,乐观锁并不依赖数据库的锁机制,而是通过检查数据的版本或标志字段来判断数据是否被其他事务修改过。
MyBatis-Plus 提供了便捷的乐观锁支持,通过在实体类中添加版本号字段(通常是一个 int 或 long 类型的字段),并在更新操作时检查版本号,以确保数据的一致性和完整性,同时不影响系统的并发性能。

乐观锁的工作原理

  1. 版本号字段:在实体类中添加一个版本号字段,通常为version
  2. 更新操作:在更新操作是,增加一个条件,检查版本号是否匹配。如果不匹配,表示数据已经被其他事务修改,更新操作失败。
    执行SQL如下
update t_user balance=?,version=? where id=? and version=?

Mybatis-Plus通过拦截器会自定将乐观锁逻辑加入sql中
使用Mybatis-Plus注意:
乐观锁支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
仅支持updateById(id)update(entity,wrapper)方法
另外,每次操作前都是先查询,替换,再更新,否则乐观锁无效

快速上手

建表

CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL COMMENT '名字',`balance` int(11) DEFAULT NULL COMMENT '余额',`version` int(11) NOT NULL DEFAULT '0' COMMENT '乐观锁版本号',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

实体类

@Data
@TableName("t_user")
public class User {@TableId(type = IdType.AUTO)private Integer id;private String name;private Integer balance;@Versionprivate Integer version;private Date createTime;private Date updateTime;
}

mapper

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

service

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
}

配置

@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){// MybatisPlus 拦截器MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 乐观锁插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}}

测试代码

@SpringBootTest
public class MpApplicationTests {@Autowiredprivate UserService userService;@Testpublic void test1(){User user = userService.getById(1);user.setName("xxx");user.setBalance(18);boolean b = userService.updateById(user);System.out.println(b);}}

查看执行后的sql

UPDATE t_user SET name=?, balance=?, version=?, create_time=? WHERE id=? AND version=?

失效情况

	// 这种情况由于没有先进行查询,乐观锁插件会失效// 执行sql如下// UPDATE t_user SET name=?, balance=? WHERE id=?@Testpublic void test1(){User user = new User();user.setId(1)user.setName("xxx");user.setBalance(18);boolean b = userService.updateById(user);System.out.println(b);}

相关文章:

  • 『uniapp』添加桌面长按快捷操作 shortcuts(详细图文注释)
  • B端产品经理如何快速完成产品原型设计
  • SQL进阶之旅 Day 8:窗口函数实用技巧
  • Flask项目进管理后台之后自动跳回登录页面,后台接口报错422,权限问题
  • 极具特色的位置运算
  • 一种通用图片红色印章去除的工具设计
  • ArcGIS Pro 3.4 二次开发 - 布局
  • 最悉心的指导教程——阿里云创建ECS实例教程+Vue+Django前后端的服务器部署(通过宝塔面板)
  • 基于Qt封装数据库基本增删改查操作,支持多线程,并实现SQLite数据库单例访问
  • 系统架构中的组织驱动:康威定律在系统设计中的应用
  • 【连接器专题】SD卡座规格书审查需要审哪些方面?
  • DeepSeek 赋能文化遗产数字化修复:AI 重构千年文明密码
  • 极简以太彩光网络解决方案4.0正式发布,“彩光”重构园区网络极简之道
  • 中国城市间地理距离矩阵(2024)
  • 显卡3080和4060哪个强 两款游戏性能对比
  • AWS Transit Gateway实战:构建DMZ隔离架构,实现可控的网络互通
  • AWS API Gateway 配置WAF(中国区)
  • 云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作)
  • 开源协议:构建全球技术协作的基石
  • 通过回调函数注册定时器触发事件
  • 扬州市邗江区建设局网站/推广网络广告
  • 门户网站建设招标书/推广链接让别人点击
  • 网站建设的分工内容/品牌推广软文200字
  • 自己做的网站怎么放视频教程/网站网址大全
  • 搭建一个平台需要什么/惠州seo代理商
  • 建设银行临江支行网站/今日小说排行榜风云榜