redis事务管理

扯淡

        事务的重要性,对于每个开发都不言而喻,否则脏数据会让你想死。我们这篇文章来看看redis的事务操作,主要是项目中集成了redis后,使用redisTemplate实现事务的过程。

相关命令

multi:开启事务
exec:提交事务
discard:回滚事务
watch:监视key,如果key被改变,则打断事务执行
unwatch:取消监视

事务特征(ACID)

普通关系型数据库:
        要求整个事务都要符合其原子性(Atomicity), 一致性(Consistency), 隔离性(Isolation), 持久性(Durability)。

redis事务特征:
        每一条命令都具有独立的原子性,所以redis的事务特征仅仅是保证批量的提交或者放弃提交。

 

执行过程

1,watch设置监视key,如果key被其他客户端改变,打断事务执行,exec返回为空数组。这个命令其实也要谨慎使用。
2,multi命令用于开启一个事务,接收到的后续命令均不会被立即执行,而是放到一个队列中,等待执行。
3,exec命令被调用时,事务队列中的命令将被逐个执行,但执行发生错误的时候,其他命令依旧会继续执行。此命令的返回值是一个数组,会返回每条命令的执行情况。
4,discard命令百调用时,事务回滚,其实就是清空队列,放弃提交的操作。
5,unwatch取消监视

 

代码示例

 

 

本文一个小问题,虽然事务的提交和回滚都么有问题,但是exec执行后返回的结果让我有点诧异

于是进行了源码的排查,发现exec()执行之后,事务队列的命令都是成功执行,且返回了“OK”的,但是在下面这个转换的地方,返回的集合就被清空了,下面这串代码的if判断感觉是有问题,看起来像官方的bug。


guolin

guolin

相信世界,向往美好,记录成长过程,分享个人心得,充实平凡生活。 网站信条:因为喜欢,所以热爱。

发表评论

电子邮件地址不会被公开。 必填项已用*标注