zoukankan      html  css  js  c++  java
  • 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就满足了持久性的要求。

  • 相关阅读:
    Docker5之Deploy your app
    Docker4之Stack
    Docker3之Swarm
    Docker之Swarm
    Docker2之Service
    Docker1之Container
    Nuget EPPlus的使用
    Nuget CsvHelper 的使用
    excel
    Chrome上的扩展工具
  • 原文地址:https://www.cnblogs.com/lippon/p/14166860.html
Copyright © 2011-2022 走看看