通过MULTI、EXEC、WATCH等命令实现事务。
1. 事务的实现
1.1 事务开始
MULTI命令的执行标志着事务的开始
通过在客户端状态的flags属性中打开REDIS_MULTI标识来完成,
1.2 命令入队
事务状态:
- 客户端发送的命令为EXEC、DISCARD、WATCH、MULTI四个命令其中的一个,那么服务器立即执行这个命令
- 其他命令,而是将这个命令放入一个事务队列里面,然后向客户端返回QUEUED回复。
1.3 事务队列
客户端都有自己的事务状态,mstate
1.4 执行事务
2. WATCH命令的实现
一个乐观锁,可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了。
如果是,服务器拒绝执行事务,并向客户端返回代表事务执行失败的空回复
2.1 使用WATCH 命令监视数据库键
每个数据库都保存着一个watched_keys字典,这个字典的键是某个被WATCH命令监视的数据库键,字典的值是一个链表,链表中记录了所有监视响应数据库键的客户端。
2.2 监视机制的触发
multi.c/touchWatchKey
2.3 判断事务是否安全
REDIS_DIRTY_CAS
3. 事务的ACID性质
3.1 原子性
Redis不支持事务回滚机制,即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。
3.2 一致性
3.3 隔离性
3.4 耐久性