上一篇文章《Mybatis plus应用(三)实现实体类自动填充cts和uts》我们介绍了mybatis的自动填充,这篇文章我们介绍下使用mybatis实现乐观锁的功能。先解释下乐观锁的含义:
乐观锁: 故名思议十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出了问题,再次更新值测试
那么实现乐观锁的步骤是怎样的呢?主要是以下的步骤:
1、取出记录时获取当前version 2、更新时,带上这个version 3、执行更新时的真实的sql语句示例是: set version = newVersion where version = oldVersion 4、如果version不对的话,则更新时间。
下面我们来演示一下。
一、创建user表
CREATE TABLE `user` ( `id` bigint(20) NOT NULL COMMENT '主键id', `name` varchar(20) DEFAULT NULL COMMENT '姓名', `age` tinyint(1) DEFAULT NULL COMMENT '性别,1:男,2:女', `tel` varchar(11) DEFAULT NULL COMMENT '手机号码', `version` int(11) DEFAULT NULL COMMENT '乐观锁', `cts` datetime DEFAULT NULL COMMENT '创建时间', `uts` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; INSERT INTO `test2`.`user` (`id`, `name`, `age`, `tel`, `version`, `cts`, `uts`) VALUES (1, '张三', 15, '13888888888', 0, '2023-02-21 11:16:49', '2023-02-21 11:17:47');
二、user实体新增一个version字段
package com.mybatis.demo.model; import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.Version; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.Builder; @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @ToString @Builder public class User implements Serializable { /** * */ private static final long serialVersionUID = 4824273035410072985L; @TableId private Long id; private String name; private Integer age; private String tel; //这里代表使用乐观锁 @Version private Integer version; @TableField(fill = FieldFill.INSERT) private Date cts; @TableField(fill = FieldFill.INSERT_UPDATE) private Date uts; }
三、注册乐观锁
package com.mybatis.demo.config; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; @EnableTransactionManagement @Configuration // 配置类 public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁插件 return interceptor; } }
四、controller方法添加update1方法
@RequestMapping("/userUpdate1") String userUpdate1() { User user = userMapper.selectById(1); user.setName("李四"); userMapper.updateById(user); return "SUCCESS"; }
五、测试
我们访问下:http://127.0.0.1:8080/userUpdate1,看下效果
可以看到version字段自动增加1了。
六、在controller添加update2方法测试失败案例
@RequestMapping("/userUpdate2") String userUpdate2() { User user = userMapper.selectById(1); user.setName("王五"); User user2 = userMapper.selectById(1); user2.setName("赵六"); int status1 = userMapper.updateById(user); int status2 = userMapper.updateById(user2); log.info("第一个更新结果是:{} 第二个更新结果是 {}",status1,status2); return "SUCCESS"; }
七、再测试下update2方法
可以看到第二个更新结果失败了,再看看数据库的数据
确实更新失败了。
这就是使用mybatis plus的乐观锁功能,我们可以很好的避免数据问题,并且避免出现ABA的情况。
最后我们附上本案例的源码下载,登录后即可下载。
还没有评论,来说两句吧...