本文介绍Redis有关事务的知识。


文章目录

  • 一、概述
  • 二、事务中的错误
  • 三、监测键


一、概述

Redis事务可以一次执行多个操作,其步骤如下:

  • 开启事务
  • 命令入队
  • 执行事务/放弃事务

涉及到的命令如下:

  • multi:开启事务,总返回OK
  • exec:执行事务
  • discard:清空事务队列, 并放弃执行事务

演示如下:

redis集群的事务管理器 redis 事务操作的常用命令_redis集群的事务管理器

二、事务中的错误

如果命令在入队时报错,则事务中的命令不会执行:

redis集群的事务管理器 redis 事务操作的常用命令_redis_02

如果事务中有命令执行出错,并不会回滚,其他的命令依旧会成功执行:

redis集群的事务管理器 redis 事务操作的常用命令_redis_03

三、监测键

WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。

被 WATCH 的键会被监视,并会检查这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。

事务只能在所有被监视键都没有被修改的前提下执行, 如果这个前提不能满足的话,事务就不会被执行。WATCH 命令可以被调用多次。 对键的监视从 WATCH 执行之后开始生效, 直到调用 EXEC 为止。

  • 当 EXEC 被调用时, 不管事务是否成功执行, 对所有键的监视都会被取消。
  • 当客户端断开连接时, 该客户端对键的监视也会被取消。
  • 使用无参数的 UNWATCH 命令可以手动取消对所有键的监视。 对于一些需要改动多个键的事务, 有时候程序需要同时对多个键进行加锁, 然后检查这些键的当前值是否符合程序的要求。 当值达不到要求时, 就可以使用 UNWATCH 命令来取消目前对键的监视, 中途放弃这个事务, 并等待事务的下次尝试。

WATCH需要在事务开启前使用,即MULTI前,案例:

客户端A监视键name和age,并开启事务,命令入队,但没有执行:

redis集群的事务管理器 redis 事务操作的常用命令_EXEC_04

客户端B修改了name的值:

redis集群的事务管理器 redis 事务操作的常用命令_redis_05

客户端A执行事务,但并没有执行成功:

redis集群的事务管理器 redis 事务操作的常用命令_客户端_06