Redis主要是有MULTI(开启事务)、EXEC(提交事务)、DISCARD(取消事务)、WATCH(监控一个变量是否发生变化) 4个指令 

1) 当WATCH不存在时,事务等于检测一连串命令是否有错误,有错误的话则自动取消事务,指令没出错的情况下才能决定回滚还是提交. 


2) 当WATCH存在时: 

①如果WATCH的变量发生变化,则整个事务返回NULL 

②如果WATCH的变量没有变化,则执行1) 

redis-transactions-1.png

1、成功执行一个没有WATCH的事务 

127.0.0.1:6379> MULTI 

OK 

127.0.0.1:6379> SET name 'smister' 

QUEUED 

127.0.0.1:6379> set age 28 

QUEUED 

127.0.0.1:6379> set favor "play game" 

QUEUED 

127.0.0.1:6379> EXEC 

1) OK 

2) OK 

3) OK 

#如果使用DISCARD则是不执行


2、错误执行一个没有WATCH的事务 

127.0.0.1:6379> MULTI 

OK 

127.0.0.1:6379> set name 'smister' 

QUEUED 

127.0.0.1:6379> se age 19 

(error) ERR unknown command 'se' <-- 错误 

127.0.0.1:6379> EXEC 

(error) EXECABORT Transaction discarded because of previous errors.


3、成功执行一个WATCH的事务 

127.0.0.1:6379> WATCH flag 

OK 

127.0.0.1:6379> MULTI 

OK 

127.0.0.1:6379> set name 'smister' 

QUEUED 

127.0.0.1:6379> set age 28 

QUEUED 

127.0.0.1:6379> EXEC 

1) OK 

2) OK


4、失败执行一个WATCH的事务 

127.0.0.1:6379(客户端1)> WATCH flag 

OK 

127.0.0.1:6379(客户端1)> MULTI 

127.0.0.1:6379> set name 'smister' 

QUEUED 127.0.0.1:6379

(客户端2)>SET flag 'false' 

OK <--- 这里是客户端2,跟上面的事务不在同一客户端 

127.0.0.1:6379> set age 28 

QUEUED 

127.0.0.1:6379> EXEC 

(nil) <--- 执行为NULL

版权声明:未经博主允许不得转载。http://smister.com/post-44/transactions.html