乐观锁介绍:
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。那么我们如何实现乐观锁呢,一般来说有以下2种方式:
1.使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
MyBatisPlus 就为我们提供了乐观锁的插件;
实现方法:1.插件配置
<bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"/>
配置位置
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="plugins">
<bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"/>
</property>
</bean>
2.注解实体字段 @Version
必须要!
示例:
public static void update() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
StudentMapper studentmapper = (StudentMapper)context.getBean("studentMapper");
//模拟两次顺序不同的访问线程
student stu = new student(8,"wwzzz",23);
stu.setVersion(1);
student stu1= new student(8,"qqqqq",23);
//实现乐观锁的修改方法
studentmapper.updateById(stu);
studentmapper.updateById(stu1);
}
执行结果:
我们可以看到 两次修改只有 第一次修改成功了/