一、事务介绍
- Redis事务是通过MULTI,EXEC, DISCARD和WATCH这四个命令来完成的。
- Redis的单个命令都是原子性的,所以这里确保事务性的对象是命令集合。
- Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断执行。
- Redis不支持回滚的操作。
二、相关命令
-
MULTI:用于标记事务块的开始。
Redis会将后续的命令逐个放入队列中,然后使用EXEC命令原子化的执行这个命令序列。
语法:MULTI
-
EXEC:在一个事务中执行所有放入队列的命令,然后恢复正常的连接状态。
语法:EXEC
-
DISCARD:清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。
语法:DISCARD
-
WATCH:当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的状态。
语法:WATCH key [key ...]
三、命令演示
- 在一个事务中设置k1=v11, k2=v22。不管在事务开启到执行结束过程中是否有其他线程更新了k1, k2,事务都会执行成功。
- 在一个事务中设置k1=v11, k2=v22,并且监控k1有没有在事务执行结束之前被其他线程修改。事务执行结束后,使用UNWATCH命令结束监控。
- 如果发生有另一个线程同时修改k1的情况,事务就会执行失败。
- 监控k1;
- 使用MULTI开启事务。此时k1=V11。
- 在事务中设置k1=3, k2=4;
- 另一个线程更新k1=BBB;
- 执行EXEC命令,提交事务;
- 结果nil,说明提交事务失败。
- 查看k1,仍然是BBB,没有被更新成3。
- 因为开启监控时,k1=V11,但是执行事务时,k1的值被修改了。此时监控不允许事务修改k1的值。