我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文依旧讲述redis事务,它和mysql的事务是不同的。redis的事务更像是个命令组合,并不具有事务最典型的原子性。那么,当内部命令里有执行失败的时候,会不会影响其它命令的执行呢?这就是本文要讨论的问题。

苏南大叔:redis事务,如何理解它命令组合里面的非原子性? - redis事务非原子性
redis事务,如何理解它命令组合里面的非原子性?(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程故事。测试环境:win10redis@5.0.14.1redis事务更像是一个命令组合。来看看命令组合里面有命令出错的话,会发生什么。

前文回顾

本文不涉及watch这个特殊命令,都是在同一个进程里面执行的。有关带watchredis事务的完整用法,可以参考:

redis官方没有提供windows版本的redis程序,官方建议在windows系统下的wsl虚拟机中使用redis。参考文章:

情况一,未识别的命令【全体报废】

del age
multi
set age 1
fdsa
set age 2
exec
get age

输出:

127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 1
QUEUED
127.0.0.1:6379> fdsa
(error) ERR unknown command `fdsa`, with args beginning with:
127.0.0.1:6379> set age 2
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get age
(nil)

输出(nil),由于调用了不存在的命令。整个redis事务报废,触发了discard。即使正确的语句也没有被执行。

苏南大叔:redis事务,如何理解它命令组合里面的非原子性? - 命令执行情况
redis事务,如何理解它命令组合里面的非原子性?(图2-2)

情况二,错误的使用方式【各玩各的】

del age
multi
set age 1
sadd age 123
set age 2
exec
get age

输出:

127.0.0.1:6379> del age
(integer) 0
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 1
QUEUED
127.0.0.1:6379> sadd age 123
QUEUED
127.0.0.1:6379> set age 2
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get age
"2"

这种情况下,age输出为2。可见,错误的命令调用(但是这个命令存在)并不影响其它命令的执行。

结语

更多苏南大叔的redis相关经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   redis