Redis也提供事务机制来满足ACID性质。
事务的实现
事务的整个过程会经历三个阶段:
- 事务开始
MULTI命令标志着事务的开始。 - 命令入队
如果客户端发送的是EXEC DISCARD WATCH MULTI四个命令,那么就会立即执行,其他的命令只会放入事务队列中等待执行。 - 事务执行
当服务器接收到了EXEC命令之后,将被服务器立即执行,服务器会遍历这个客户端的事务队列,执行所有保存的命令,最后将所得的结果都返回给客户端。
WATCH命令的实现
WATCH命令是一个乐观锁,它可以在EXEC命令执行之前,监视任意数量的数据库键,检查被监视的键是否至少有一个已经被修改过了,如果是的花,服务器将拒绝执行事务,并向客户端返回事务失败的回复。
WATCH监视机制
Redis通过一个字典数据结构标记每个被监视的键,键对应的值就是监视的客户端序号,如发生数据该表,相应的客户端的标志将会被置位,表示事务的安全性已经被破坏了。在之后的EXEC命令执行之前,就会查询这个字典,确定事务安全。
事务的ACID性质
原子性
对于Redis事务功能,事务队列中的命令要么都执行,要么都不执行,这就体现了其原子性。
不同于传统的关系型数据库,Redis不支持事务回滚机制,如果事务队列的执行中发生了错误,整个事务还是会继续执行。这样设计的原因是,回滚机制太复杂,这种错误一般都是后台程序的问题,也只会出现来开发的环境中,实际的生产环境中很少出现,所以没必要。
一致性
一致性就是指在事务执行前后数据也是保持一致的。
Redis通过错误检测和简单的设计保证事务的一致性。
- 入队错误
在事务命令入队的过程中,发现命令有问题,就会不执行这个事务。 - 执行错误
在实际执行过程中,发生了错误,服务器不会中断事务的执行。这种错误不会对数据库产生修改,也就不会影响一致性。 - 服务器停机
如果在执行事务的过程中停机,那么会服务器所使用的持久化模式,保持数据的一致。
隔离性
Redis采用单线程的方式来执行事务,并且服务器保证事务执行期间不会被中断,事务总是以串行的方式运行,所以是具有隔离性的。
持久性
Redis的RDB和AOF就满足了持久性的要求。