简单示例演示:乐观锁实现之《版本号》

乐观锁主要有两种实现方式:版本号机制和 CAS(Compare And Swap,比较并交换)机制。下面分别介绍:

1. 版本号机制

版本号机制通过为数据添加版本标识,每次更新时检查版本是否匹配来判断是否有并发冲突。

代码示例:

1.创建实体:

java 复制代码
@lombok.Data
@lombok.AllArgsConstructor
@lombok.NoArgsConstructor
public class Data {
    /**
     * 实体类
     */
        private int id;
        private int version;
        private String value;

}

2.创建一个controller

java 复制代码
@RestController
@RequestMapping("/versionOptimisticLock")
public class VersionOptimisticLockController {

    @Autowired
    private VersionOptimisticLockMapper mapper;

    @PutMapping("/update")
    public void update(@RequestBody Data data) {
        Data dataById = mapper.getById(data.getId());//获取数据库中的数据
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        int affectRows = mapper.update(dataById);
        if (affectRows == 0) {
            throw new RuntimeException("更新失败");
        }
        System.out.println("更新成功");
    }

}

创建mapper:

java 复制代码
@Mapper
public interface VersionOptimisticLockMapper {
   @Update("update optimisticlockTable set value=#{value},version=version+1 where id=#{id} and version=#{version}")
    int update(Data data);

   @Select("select id, value, version from optimisticlockTable where id= #{id} ")
    Data getById(int id);
}

使用postman等工具进行测试,发送两个请求同时,结果肯定是一个成功一个失败。

控制台:

相关推荐
一起养小猫26 分钟前
LeetCode100天Day6-回文数与加一
java·leetcode
程序员小假1 小时前
我们来说一下 MySQL 的慢查询日志
java·后端
独自破碎E1 小时前
Java是怎么实现跨平台的?
java·开发语言
To Be Clean Coder2 小时前
【Spring源码】从源码倒看Spring用法(二)
java·后端·spring
xdpcxq10292 小时前
风控场景下超高并发频次计算服务
java·服务器·网络
想用offer打牌2 小时前
你真的懂Thread.currentThread().interrupt()吗?
java·后端·架构
橘色的狸花猫2 小时前
简历与岗位要求相似度分析系统
java·nlp
独自破碎E2 小时前
Leetcode1438绝对值不超过限制的最长连续子数组
java·开发语言·算法
用户91743965392 小时前
Elasticsearch Percolate Query使用优化案例-从2000到500ms
java·大数据·elasticsearch
yaoxin5211233 小时前
279. Java Stream API - Stream 拼接的两种方式:concat() vs flatMap()
java·开发语言