自学内容网 自学内容网

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)!