redis事务的执行过程
事务从开始到结束通常会经历3个阶段:
- 事务开始 //MULTI
- 命令入队
- 事务执行 //EXEC
事务开始
redis > MULTI
ok
MULTI命令可以将客户端从非事务状态切换至事务状态,是通过在客户端状态的flags属性中打开REDIS_MUTLI标志实现的
命令入队
当客户端处于事务状态时,所有除EXEC、DISCARD、WATCH、MULTI外的操作时,将被放入事务队列中,
每个客户端都有自己的事务状态,对应了每个redisClient结构体中的multiState mstate
typedef struct redisClient {
//...
//事务转态
multiState mstate;
//...
}redisClient ;
typedef struct multiState {
//事务队列,FIFO
multiCmd *commands;
//已入队的计数
int count;
} multiState ;
WATCH命令
WATCH命令在EXEC之前监视一个key的变化,如果该key被(别的客户端)改变了,那么之后的EXEC将不会执行。