1、事务开始命令:MULTI ;标记一个事务的开始,事务块的多条命令会顺序入队列,这个队列称为事务块,最后由EXEC命令原子执行。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set abc 1234
QUEUED
127.0.0.1:6379> set def 456
QUEUED
127.0.0.1:6379> set ijk 900
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> keys *
1) "ijk"
2) "def"
3) "abc"
2、事务执行命令:EXEC ;执行事务队列里面的命令; 如果某个key在watch命令的监视下,且事务块中有和这些key相关的命令,那么在MUTIL到EXEC期间这些key没有被其他命令改动的情况下执行成功并生效,否则被打断,打断返回nil
打断的情况:
客户端1执行:
127.0.0.1:6379> WATCH lock1 lock2
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set aaaa woaini
QUEUED
127.0.0.1:6379> set bbbb defadsf
QUEUED
127.0.0.1:6379> set lock1 xiaomingxiaoming
QUEUED
127.0.0.1:6379> set lock2 xiaohua
QUEUED
127.0.0.1:6379> EXEC
(nil)
当客户端1执行到set lock2 xiaohua的时候,客户端2:
127.0.0.1:6379> set lock1 xiaodongxiaodong
OK
127.0.0.1:6379>
修改了lock1的内容,那么这个事务就会被打断,返回nil,当然事务前的也没有执行成功了:
127.0.0.1:6379> WATCH lock1 lock2
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set aaaa woaini
QUEUED
127.0.0.1:6379> set bbbb defadsf
QUEUED
127.0.0.1:6379> set lock1 xiaomingxiaoming
QUEUED
127.0.0.1:6379> set lock2 xiaohua
QUEUED
127.0.0.1:6379> EXEC
(nil)
127.0.0.1:6379> get aaaa
(nil)
127.0.0.1:6379> get bbbb
(nil)
3、监视一个或者多个key:WATCH key [key ...] ;如果事务执行前这些key被其他的命令改动,那么事务会被打断。
4、取消WATCH命令对所有的key的监视:UNWATCH ;如果已经执行了EXEC或者DISCARD,返回值总是ok
127.0.0.1:6379> WATCH lock
OK
127.0.0.1:6379> UNWATCH
OK
4、取消事务,放弃执行事务块里面的所有命令:DISCARD
如果正在用WATCH监控某个key,那么取消监视等同于执行了命令UNWATCH。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set woaini 1314
QUEUED
127.0.0.1:6379> set xiaoming xiaofang
QUEUED
127.0.0.1:6379> DISCARD
OK