乐观锁实现

本文通过使用MyBatis的Mapper文件定义SQL语句,实现了一个乐观锁机制来处理并发更新问题。通过固定线程池执行多个任务,每个任务尝试更新数据库中带有版本号的记录,仅当提交的版本号与数据库中相同才会执行更新,确保数据一致性。

mapper:


<select id="queryLock" resultType="java.util.Map">
select upg,version from happy_lock
</select>

<update id="editHappyLock" parameterType="java.util.Map">
update happy_lock
set upg=#{upg},version=version+1
where id=#{id} and version=#{version};
</update>
测试:
@Test
public void happyLock() {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(20);
for(int i=0;i<10;i++){
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try{
Map<String, Object> map = new HashMap<>();
map.put("id", 1);
Random rand = new Random();
Map<String,Object> mapTemp=nyHappyLockService.queryLock();
int randomCount=rand.nextInt(100);
int upg = Integer.valueOf(mapTemp.get("upg").toString());
int version = Integer.valueOf(mapTemp.get("version").toString());
map.put("version", version);
map.put("upg", (randomCount+version));
int count=nyHappyLockService.editHappyLock(map);
System.out.println(Thread.currentThread()+" "+Thread.currentThread().getName()+" 执行的结果数"+count);
}catch (Exception e){
e.printStackTrace();
}
}
});
}
}
执行结果:

提交的数据 版本号大于数据库表当前版本号,更新。可以看到后面的线程版本号都低于第一个版本 只有第一个执行成功后面的 都废弃了


转载于:https://www.cnblogs.com/austinspark-jessylu/p/11428129.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值