栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

乐观锁,悲观锁

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

乐观锁,悲观锁

在面试过程中,我们经常会被问道乐观锁和悲观锁,这个其实非常简单。

乐观锁:

故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,再次更新值测试。

悲观锁:

故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁,再去操作。
我们这里主要讲解乐观锁机制。

乐观锁实现方式:

取出记录时,获取当前 version
更新时,带上这个 version
执行更新时,set version = newVersion where version = oldVersion
如果 version 不对,就更新失败。

-- 乐观锁:1、先查询,获得版本号 version = 1
-- A
update user set name = "kuangshen", version = version + 1 where id = 2 and version = 1
-- B:线程抢先完成,这个时候 version = 2,会导致 A 修改失败!
update user set name = "kuangshen", version = version + 1 where id = 2 and version = 1

测试一下MyBatisPlus的乐观锁插件

2、实体类加对应的字段,并用 @Version标注。

@Version // 乐观锁Version注解
private Integer version;

3、注册组件。

package com.cxy.config;

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration // 配置类
public class MyBatisPlusConfig {

	// 注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

4、进行测试。

// 测试乐观锁成功
@Test
public void testOptimisticLocker(){
    // 1.查询用户信息
    User user = userMapper.selectById(1L);
    // 2.修改用户信息
    user.setName("xxx");
    user.setEmail("3419339201@qq.com");
    userMapper.updateById(user);
}

// 测试乐观锁失败,多线程环境下!
@Test
public void testOptimisticLocker2(){
    // 线程1
    User user = userMapper.selectById(1L);
    user.setName("user1");
    user.setEmail("2439115397@qq.com");

    // 模拟另外一个线程执行了插队操作
    User user2 = userMapper.selectById(1L);
    user2.setName("user2");
    user2.setEmail("2953887629@qq.com");
    userMapper.updateById(user2);

    userMapper.updateById(user); // 如果没有乐观锁就会覆盖插队线程的值!
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/685830.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号