1.概述
redis通过MULTI、EXEC、WATCH等命令来实现事务功能。事务以MULTI命令开始,最后由EXEC命令将事务提交给服务器。WATCH命令是一个乐观锁,它可以再EXEC命令执行之前,监视任意数量的数据库key,并在EXEC命令执行的时候,检测是否有某个key被修改过了,如果是,服务器将拒绝事务,并向客户端返回执行失败的响应。
2.实现
事务的实现分为三个阶段:
1)事务的开始
2)命令入队列
3)事务执行
2.1 事务开始
- MULTI命令可以将执行该命令的客户端非事务状态切换至事务状态,通过客户端状态的flags属性中打开REDIS_MULTI标识来完成。
2.3 事务入队列
- 每个redis客户端都有自己的事务状态,这个事务状态保存在客户端状态的mstate属性里面:
/* With multiplexing we need to take per-client state.
* Clients are taken in a liked list.
*
* 因为 I/O 复用的缘故,需要为每个客户端维持一个状态。
*
* 多个客户端状态被服务器用链表连