赞
踩
当要更新一条记录的时候,希望这条记录没有被别人更新。
乐观锁实现方式:
乐观锁:顾名思义十分乐观,它总是认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再次更新值测试。
悲观锁:顾名思义十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!
默认值为1
/**
* 乐观锁注解
*/
@Version
private Integer version;
注意:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
配置类:
package cn.com.dwr.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @MapperScan("cn.com.dwr.mapper") // 扫描mapper @EnableTransactionManagement // 自动管理事务 @Configuration // 配置类 public class MybatisPlusConfig { /** * 注册乐观锁插件 * @return */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mybatisPlusInterceptor; } }
成功案例:
/**
* 测试乐观锁成功案例
*/
@Test
public void testOptimisticLocker(){
// 1.查询用户信息
User user = userMapper.selectById(1L);
// 2.修改用户信息
user.setName("Paul");
user.setEmail("33334343@qq.com");
// 3.执行更新操作
userMapper.updateById(user);
}
sql语句:
数据库中发现更新时间变化了,版本号变为了2
失败案例:
/** * 测试乐观锁失败案例:多线程下 */ @Test public void testOptimisticLocker2(){ // 线程1 User user = userMapper.selectById(1L); user.setName("Mike"); user.setEmail("mike@qq.com"); // 模拟另外一个线程执行了插队操作 User user2 = userMapper.selectById(1L); user2.setName("Candy"); user2.setEmail("candy@qq.com"); userMapper.updateById(user2); userMapper.updateById(user); }
sql语句:
发现user的值并没有改变,因为version的值不对,更新失败。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。