redis的事物
作者:bin开启事物(multi),开启事物后,执行命令返回(QUEUED)表示命令已压到队列中,执行(exec)按队列顺序提交事物,返回ok即表示提交成功
127.0.0.1:6379> multi OK 127.0.0.1:6379> set name zengbin QUEUED 127.0.0.1:6379> exec 1) OK 127.0.0.1:6379>
WATCH命令的用法:
watch命令关注的值,如果被其他session修改,即当前session事物会执行失败
session A watch name,然后开启事物
(session A)127.0.0.1:6379> watch name OK (session A)127.0.0.1:6379> multi OK
session B 修改name
(session B)127.0.0.1:6379> set name maodou OK
session A 提交事物,未返回ok,返回的是(nil),表示事物提交失败
(session A)127.0.0.1:6379> set name dandan QUEUED (session A)127.0.0.1:6379> exec (nil)
事物的原子性
只要是开启事物后,执行命令出错,那么整个事物都不会执行成功
127.0.0.1:6379> multi OK 127.0.0.1:6379> set name dd QUEUED 127.0.0.1:6379> get (error) ERR wrong number of arguments for 'get' command 127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379>
事物的一致性
事物在提交前后,不会改变原有key的属性
例如下面,name 原来是 string 类型,在事物中将其作为list操作,事物中不会报错,提交后会「部分报错」,即保证类name事物前后的数据类型一致性
127.0.0.1:6379> set name maodou OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> sadd fruit a b c QUEUED 127.0.0.1:6379> rpush name d f g QUEUED 127.0.0.1:6379> sadd car t y u QUEUED 127.0.0.1:6379> exec 1) (integer) 3 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) (integer) 3