NingG +

Redis 设计与实现:事务

Client 发起一次事务时:

事务执行的基本过程:

Client 输入 multi 命令,将开启 redisClient 中事务flag,同时,在事务中:

具体,事务操作的基本过程:

watch 命令,实现乐观锁,可以在事务执行之前,监视任意数量的 key:

watch 命令,实现机制:

watch 命令,对应 redisDb 中的存储结构 watched_keys 字典:

事务的ACID属性:

Redis中,事务的ACID属性的表现:

  1. 原子性:Redis 的一个事务,如果单个命令错误,不会回滚,也不影响其前后的其他命令执行
  2. 一致性:
    1. 入队错误:整个事务都不执行,标记 redisClient 的 flag 为 REDIS_EXEC_DIRTY (Redis 2.6.5 之前的版本,即使入队错误,已经成功入队的命令,仍会执行)
    2. 执行错误:事务执行过程中,一条命令执行出错,不会影响其前后其他命令的执行
    3. 服务器宕机:RDB 模式,持久化文件都是一致状态;AOF模式,会自动恢复到最近的一次一致状态
  3. 隔离性:单进程单线程的Server服务(读写数据),串行化
  4. 持久性:RDB、AOF两种持久化方式

疑问:Redis 的一个事务中,是否会出现脏读、不可重复读、幻读的现象?

参考资料

Top