redis事务java_java 使用RedisTemplate实现Redis事务

Redis作为单线程模型,其事务保证命令的批量顺序执行,但不支持异常回滚。Redis事务包括MULTI、EXEC、DISCARD、WATCH和UNWATCH等命令。在Spring Data Redis中,使用RedisTemplate进行事务操作时,需通过SessionCallback来实现,避免"No ongoing transaction"错误。
摘要由CSDN通过智能技术生成

关系型数据库事务的作用是保证并发访问下数据的一致性,Redis事务有些不同,由于Redis是单线程的处理来自client的指令,所以Redis所有命令的执行都是原子性的,举一个简单的例子,单个Redis服务器下,并发地执行INCR命令,也不会返回相同的结果。

所以Redis事务的意义在于保证命令的批量顺序执行,并且事务执行期间,Redis不会执行来自client的其他请求。有一点需要注意的是,。如果有命令执行失败,还是会继续执行剩下的命令,因为Redis没有异常回滚。

对“Redis事务命令要么全部执行,要么全部不执行”这句事实的理解:如果有命令执行失败,并不是中断事务,而是继续执行剩下的指令,因为Redis不支持异常回滚。全部不执行的情况有 1.没有执行EXEC命令 2.WATCH的key发生改变 3.DISCARD命令放弃事务。本质上开启事务后,所有输入的命令都被缓存在一个队列中,一旦EXEC,队列里的指令被一条一条的执行。

关于事务的API

MULTI    开启事务

EXEC    执行任务队列里所有命令,并结束事务

DISCARD     放弃事务,清空任务队列,全部不执行,并UNWATCH

WATCH key [key1]    MULTI执行之前,指定监控某key,如果key发生修改,放弃整个事务执行

UNWATCH    手动取消监控

Spring Data Redis 事务问题

RedisTemplate来操作Redis,关于事务操作的时候会有问题:

redisTemplate.multi();

redisTemplate.opsForValue().increment("xxx",1);

redisTemplate.opsForValue().increment("ttt",1);

redisTemplate.exec();

调用会报一个错误“No ongoing transaction. Did you forget to call multi? ”查了下,RedisTemplate操作事务不能理所当然地像原生API那么写,其实RedisTemplate的事务需要自己实现一个SessionCallBack来做事务,所以要这么写

SessionCallback sessionCallback = newSessionCallback() {

@Overridepublic Object execute(RedisOperations redisOperations) throwsDataAccessException {

redisOperations.multi();//TODO: 2017/11/20 命令1//TODO: 2017/11/20 命令2//TODO: 2017/11/20 命令3

returnredisOperations.exec();

}

};

redisTemplate.execute(sessionCallback);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值