// redis 读后写aba操作,a操作
@RequestMapping("/A")
@ResponseBody
public String optA(HttpServletResponse response) throws Exception {
String res = null;
List rs = null;
redisUtil.getTemplate().setEnableTransactionSupport(true);
try {
do {
redisUtil.getTemplate().watch("dayQuota");
String dayQuota = redisUtil.getValue("dayQuota").toString();
int dayQuotaint = Integer.parseInt(dayQuota);
res = String.format("optA %d+1=%d", dayQuotaint, dayQuotaint + 1);
dayQuotaint = dayQuotaint + 1;
// 耗时操作
Thread.sleep(5000);
redisUtil.getTemplate().multi(); // 开始事务
redisUtil.setValue("dayQuota", dayQuotaint);
rs = redisUtil.getTemplate().exec();// 提交事务
//System.out.println(JSON.toJSONString(rs, true));
log.debug(res);
} while (rs == null||rs.size()==0);// 多重检测,直到执行成功。
}
redis 读后写aba操作
最新推荐文章于 2022-09-09 14:54:01 发布
本文讨论了在Redis中遇到的读后写ABA问题,具体表现为A接口读取dayQuota并加1,然后B接口修改值,A接口醒来后发现值被改变,从而引发回滚和重新读取并更新。详细步骤包括A的初次读取、B的读取与更新、A的更新失败以及最终的修正操作。
摘要由CSDN通过智能技术生成