Redis设计与实现(四)——事务

Redis也提供事务机制来满足ACID性质。

事务的实现

事务的整个过程会经历三个阶段:

  1. 事务开始
    MULTI命令标志着事务的开始。
  2. 命令入队
    如果客户端发送的是EXEC DISCARD WATCH MULTI四个命令,那么就会立即执行,其他的命令只会放入事务队列中等待执行。
  3. 事务执行
    当服务器接收到了EXEC命令之后,将被服务器立即执行,服务器会遍历这个客户端的事务队列,执行所有保存的命令,最后将所得的结果都返回给客户端。

WATCH命令的实现

WATCH命令是一个乐观锁,它可以在EXEC命令执行之前,监视任意数量的数据库键,检查被监视的键是否至少有一个已经被修改过了,如果是的花,服务器将拒绝执行事务,并向客户端返回事务失败的回复。

WATCH监视机制
Redis通过一个字典数据结构标记每个被监视的键,键对应的值就是监视的客户端序号,如发生数据该表,相应的客户端的标志将会被置位,表示事务的安全性已经被破坏了。在之后的EXEC命令执行之前,就会查询这个字典,确定事务安全。

事务的ACID性质

原子性

对于Redis事务功能,事务队列中的命令要么都执行,要么都不执行,这就体现了其原子性。

不同于传统的关系型数据库,Redis不支持事务回滚机制,如果事务队列的执行中发生了错误,整个事务还是会继续执行。这样设计的原因是,回滚机制太复杂,这种错误一般都是后台程序的问题,也只会出现来开发的环境中,实际的生产环境中很少出现,所以没必要。

一致性

一致性就是指在事务执行前后数据也是保持一致的。
Redis通过错误检测和简单的设计保证事务的一致性。

  1. 入队错误
    在事务命令入队的过程中,发现命令有问题,就会不执行这个事务。
  2. 执行错误
    在实际执行过程中,发生了错误,服务器不会中断事务的执行。这种错误不会对数据库产生修改,也就不会影响一致性。
  3. 服务器停机
    如果在执行事务的过程中停机,那么会服务器所使用的持久化模式,保持数据的一致。

隔离性

Redis采用单线程的方式来执行事务,并且服务器保证事务执行期间不会被中断,事务总是以串行的方式运行,所以是具有隔离性的。

持久性

Redis的RDB和AOF就满足了持久性的要求。

原文地址:https://www.cnblogs.com/lippon/p/14166860.html