关于Redis事务是否满足原子性

76 阅读1分钟

个人理解这个问题需要分两种情况讨论

  • multi开启事务后命令队列语法有错误或取消事务discard
  • multi开启事务后命令队列运行错误

第一种情况

可以看到开启事务后输入一个错误语法命令get name zhangsan后立即显示错误提示了,再执行exec自然也是不行的,所有命令都不会执行。

discard的情况就不用说了,取消事务。

这种情况下是满足事务的原子性的,要不所有命令执行成功,要不一个命令都不执行。

第二种情况

开启事务后命令语法正确,但是在命令执行期间出错,如输入参数的数据类型不符合命令的参数要求。

set name后用了list的指令,可以看到命令执行后,能够正确运行的命令会执行,运行错误的命令不会被执行。这种情况下Redis 事务其实不满足原子性的,也就是Redis 不支持事务回滚机制,运行错误需要手动回滚(应该避免)。

为什么Redis不支持回滚

官方文档说明: