上一篇文章《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的情况。
最后我们附上本案例的源码下载,登录后即可下载。












还没有评论,来说两句吧...