在并发情况下,多个线程同时对于同一条数据进行操作,可能会对出现数据丢失更新的问题,此类问题可以使用乐观锁来实现。
(1)在表中的字段与类中的属性字段要对应:
private int version;
(2)在属性加上相关注解
@Version
private int version;
(3)增加配置类
@Configuration
public class VersionConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
(4)测试添加数据
@Test
public void test02() {
User user = new User();
user.setAge(18);
user.setEmail("1961871256@qq.com");
user.setName("刘老师");
int result = userMapper.insert(user);
System.out.println(result);
}
执行sql如下:
==> Preparing: INSERT INTO user ( id, name, age, email, create_time, update_time, version ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
==> Parameters: 1388048014324580354(Long), 刘老师(String), 18(Integer), 1961871256@qq.com(String), 2021-04-30 16:30:09.959(Timestamp), 2021-04-30 16:30:09.959(Timestamp), 0(Integer)
<== Updates: 1
注意:如果version没有初始化值,第一次添加记录时version的默认值为0,每次修改一次version会增加1。
数据库的记录如下:
修改该条记录,记录version的字段值变化
@Test
public void test03() {
User user = userMapper.selectById(1388048014324580354l);
user.setName("赵老师");
int result = userMapper.updateById(user);
System.out.println(result);
}
执行SQL如下:
==> Preparing: UPDATE user SET name=?, age=?, email=?, create_time=?, update_time=?, version=? WHERE id=? AND version=?
==> Parameters: 赵老师(String), 18(Integer), 1961871256@qq.com(String), 2021-04-30 16:30:09.0(Timestamp), 2021-04-30 16:34:15.766(Timestamp), 1(Integer), 1388048014324580354(Long), 0(Integer)
<== Updates: 1
数据库记录如下: