乐观锁实现

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