三个命令
Redis 事务通过三个命令进行控制。
- multi:开启事务
- exec:执行事务
- discard:取消事务
Redis 事务异常处理
当事务中的命令出现语法错误时,整个事务在 exec 执行时会被取消。
Redis 事务隔离机制
-
为什么需要隔离机制
在并发场景下可能会出现多个客户端对同一个数据进行修改的情况。
-
隔离的实现
Redis 通过 watch 命令再配合事务实现了多线程下的执行隔离。
-
实现原理
- 当某一客户端对 key 执行了 watch 后,系统就会为该 key 添加一个 version 乐观锁,并初始化 version。例如初值为 1.0。
- 此后客户端 C 左将对该 key 的修改语句写入到了事务命令队列中,虽未执行,但其将该key 的 value 值与 version 进行了读取并保存到了当前客户端缓存。此时读取并保存的是version 的初值 1.0。
- 此后客户端 C 右对该 key 的值进行了修改,这个修改不仅修改了 key 的 value 本身,同时也增加了 version 的值,例如使其 version 变为了 2.0,并将该 version 记录到了该 key信息中。
- 此后客户端 C 左执行 exec,开始执行事务中的命令。不过,其在执行到对该 key 进行修改的命令时,该命令首先对当前客户端缓存中保存的 version 值与当前 key 信息中的version 值。如果缓存 version 小于 key 的 version,则说明客户端缓存的 key 的 value 已经过时,该写操作如果执行可能会破坏数据的一致性。所以该写操作不执行。