005-Redis 事物操作
redis 事物操作案例:
@GetMapping("/multiMethod")
public void MultiMethod() {
// 模拟转账操作(模拟 Mike,Jack用户各有 100 元)
redisTemplate.opsForValue().set("Mike", "100");
redisTemplate.opsForValue().set("Jack", "100");
// 进行转账操作(转账 20 元)
int transfer = 20;
String mike = redisTemplate.opsForValue().get("Mike");
redisTemplate.setEnableTransactionSupport(true); // 开启事务支持
redisTemplate.watch(Stream.of("Mike", "Jack").collect(Collectors.toList())); // 开启监听
try {
// 判断余额是否足够
if (null != mike && Integer.parseInt(mike) >= transfer) {
redisTemplate.execute(new SessionCallback<List<Object>>() {
@Override
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi();// 开启事务
redisTemplate.opsForValue().decrement("Mike", (long) transfer); // 转出
redisTemplate.opsForValue().increment("Jack", (long) transfer); // 转入
return operations.exec(); // 提交事务
}
});
System.out.println("双方转账成功");
} else {
System.out.println("Mike 账户余额不足,转账失败");
}
} catch (Exception e) {
System.out.println("转账过程中出现异常:" + e.getMessage());
redisTemplate.discard(); // 回滚
} finally {
System.out.println("转账后双方余额:Mike:" + redisTemplate.opsForValue().get("Mike") + ", Jack: " + redisTemplate.opsForValue().get("Jack"));
// 删除测试数据
redisTemplate.delete(Stream.of("Mike", "Jack").collect(Collectors.toList()));
}
}
原文地址:https://blog.csdn.net/xiaogang1226/article/details/144379049
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!