level 1
老陈73
楼主
测试代码:
public boolean LockTest(int superId, String organName, long time) throws InterruptedException {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String date = "2022-09-17 15:02:00";
LocalDateTime localTime = LocalDateTime.parse(date, dtf);
while (LocalDateTime.now().isBefore(localTime)) {
continue;
}
String key = "LockOrgan" + String.valueOf(superId) + organName;
logger.warn("time:{}", time);
String times = String.valueOf(time);
if (pubFunc.isRedisKey(key) == false) {
redisTemplate.watch(key);
redisTemplate.opsForValue().set(key, times, 10, TimeUnit.SECONDS);
Thread.sleep(1000);
String write = redisTemplate.opsForValue().get(key);
logger.warn("time:{}--write:{}--{}", times, write, write.equals(times));
return write.equals(times) ? true : false;
} else {
logger.warn("Lock存在{}", key);
return false;
}
}
测试结果:
2022-09-17T15:02:00.000 : time:1663398086295
2022-09-17T15:02:00.000 : time:1663398083833
2022-09-17T15:02:01.016 : time:1663398086295--write:1663398086295--true
2022-09-17T15:02:01.016 : time:1663398083833--write:1663398086295--false
2022-09-17T15:02:01.016 : 重复提交次数:1
2022-09-17T15:02:02.017 : time:1663398083833
2022-09-17T15:02:03.027 : time:1663398083833--write:1663398083833--true
测试结论:
只使用redistemplate.watch(),似乎也能实现乐观锁,在模拟的第二个进程修改同一key时,未修改成功。
问题:
我百度了很多使用redistemplate实现乐观锁的方法,都要使用事务,需要加上以下代码:
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.multi();
List<Object> exec = redisTemplate.exec();
但我不使用事务,只用watch(),似乎也实现了乐观锁。
2022年09月17日 07点09分
1
public boolean LockTest(int superId, String organName, long time) throws InterruptedException {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String date = "2022-09-17 15:02:00";
LocalDateTime localTime = LocalDateTime.parse(date, dtf);
while (LocalDateTime.now().isBefore(localTime)) {
continue;
}
String key = "LockOrgan" + String.valueOf(superId) + organName;
logger.warn("time:{}", time);
String times = String.valueOf(time);
if (pubFunc.isRedisKey(key) == false) {
redisTemplate.watch(key);
redisTemplate.opsForValue().set(key, times, 10, TimeUnit.SECONDS);
Thread.sleep(1000);
String write = redisTemplate.opsForValue().get(key);
logger.warn("time:{}--write:{}--{}", times, write, write.equals(times));
return write.equals(times) ? true : false;
} else {
logger.warn("Lock存在{}", key);
return false;
}
}
测试结果:
2022-09-17T15:02:00.000 : time:1663398086295
2022-09-17T15:02:00.000 : time:1663398083833
2022-09-17T15:02:01.016 : time:1663398086295--write:1663398086295--true
2022-09-17T15:02:01.016 : time:1663398083833--write:1663398086295--false
2022-09-17T15:02:01.016 : 重复提交次数:1
2022-09-17T15:02:02.017 : time:1663398083833
2022-09-17T15:02:03.027 : time:1663398083833--write:1663398083833--true
测试结论:
只使用redistemplate.watch(),似乎也能实现乐观锁,在模拟的第二个进程修改同一key时,未修改成功。
问题:
我百度了很多使用redistemplate实现乐观锁的方法,都要使用事务,需要加上以下代码:
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.multi();
List<Object> exec = redisTemplate.exec();
但我不使用事务,只用watch(),似乎也实现了乐观锁。