一、事务基本使用
在讲解事务的原理之前,我们先来看看 Redis 事务是如何使用的吧
事务在其他语言中,一般分为以下三个阶段:
- 开启事务——Begin Transaction
- 执行业务代码,提交事务——Commit Transaction
- 业务处理中出现异常,回滚事务——Rollback Transaction
但是,Redis 中的事务是不是也是如此呢?🤭🤭🤭
Redis 中的事务从开始到结束也是要经历三个阶段:
- 开启事务
- 命令入列
- 执行事务/放弃事务
其中,开启事务使用 multi
命令,事务执行使用 exec
命令,放弃事务使用 discard
命令。
1、开启事务
multi
命令用于开启事务,实现代码如下:
> multi
OK
multi
命令可以让客户端从非事务模式状态,变为事务模式状态,如下图所示:
小贴士:multi 命令不能嵌套使用,如果已经开启了事务的情况下,再执行 multi 命令,会提示如下错误:
(error) ERR MULTI calls can not be nested
当客户端是非事务状态时,使用 multi
命令,客户端会返回结果 OK,如果客户端已经是事务状态,再执行 multi
命令会发生不能嵌套的错误,但不会终止客户端为事务的状态,如下图所示:
2、命令入队
客户端进入事务状态之后,执行的所有常规 Redis 操作命令(非触发事务执行或放弃和导致入列异常的命令)会依次入列,命令入列成功后会返回 QUEUED,此时命令并不会立即执行,如下代码所示:
> multi
OK
> set k v
QUEUED
> get k
QUEUED
执行流程如下图所示:
小贴士:命令会按照先进先出(FIFO)的顺序出入列,也就是说事务会按照命令的入列顺序,从前往后依次执行。
3、执行事务/放弃事务
执行事务的命令是 exec
,放弃事务的命令是 discard
。
执行事务示例代码如下:
> multi
OK
> set k v2
QUEUED
> exec
1) OK
> get k
"v2"
放弃事务示例代码如下:
> multi
OK
> set k v3
QUEUED
> discard
OK