首页 > 中间件 > redis的事物

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

您必须 [ 登录 ] 才能发表留言!