Redis的事务

本文深入解析Redis事务控制机制,通过具体代码示例说明如何使用watch、multi和exec命令。阐述了在事务中对键值监控的原理,以及当键值被外部修改时,事务将被放弃的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在redis中的事务控制由watch,multi,exec来实现

public String testT() {
    redisTemplate.opsForValue().set("one", "one");
    List list =(List) redisTemplate.execute(new SessionCallback() {
        @Override
        public Object execute(RedisOperations oper) throws DataAccessException {
            //设置监控key
            oper.watch("one");
            //开启事务,在exec执行前,全部都只是进入队列
            oper.multi();
            oper.opsForValue().set("two", "two");
            //获取值为null,因为还在队列里面
            Object two = oper.opsForValue().get("two");
            if (two == null) {
                System.out.println("插入还没执行");
            }
            return oper.exec();
        }
    });
    System.out.println(list);
    return "OK";
}

上面代码首先在redis中插入one,正常执行后redis中有2条记录one,two

其中注意点就是get的时候为null是因为在exec之前,所有的操作全在队列中,并获取不到该key的值

1.进行对应报错操作

redisTemplate.opsForValue().set("one", "one");
List list =(List) redisTemplate.execute(new SessionCallback() {
    @Override
    public Object execute(RedisOperations oper) throws DataAccessException {
        //设置监控key
        oper.watch("one");
        //开启事务,在exec执行前,全部都只是进入队列
        oper.multi();
        oper.opsForValue().increment("one", 1);
        oper.opsForValue().set("two", "two");
        //获取值为null,因为还在队列里面
        Object two = oper.opsForValue().get("two");
        if (two == null) {
            System.out.println("插入还没执行");
        }
        return oper.exec();
    }
});
System.out.println(list);
return "OK";

由于one存的是字符串 oper.opsForValue().increment("one", 1);操作时会报错,但是结果还是插入2条,

2.进行修改值的操作

在oper.watch("one");后打断点把one的值进行修改,再运行,则不会进行插入第二条

 

总结:在redis中的事务中是对one的值进行监控,如果值发生了变化则放弃事务,即队列中的命令全部放弃

如果没有发生变化,并且是中间某条操作发生异常,会跳过这条命令继续执行。

@Transactional的注解可以实现整个方法的事务控制

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值