@@ -21,48 +21,101 @@ Redis 可以通过 **`MULTI`,`EXEC`,`DISCARD` 和 `WATCH`** 等命令来实
2121``` bash
2222> MULTI
2323OK
24- > SET USER " Guide哥 "
24+ > SET PROJECT " JavaGuide "
2525QUEUED
26- > GET USER
26+ > GET PROJECT
2727QUEUED
2828> EXEC
29291) OK
30- 2) " Guide哥 "
30+ 2) " JavaGuide "
3131```
3232
33- 使用 [ ` MULTI ` ] ( https://redis.io/commands/multi ) 命令后可以输入多个命令。 Redis 不会立即执行这些命令,而是将它们放到队列,当调用了 [ ` EXEC ` ] ( https://redis.io/commands/exec ) 命令将执行所有命令 。
33+ [ ` MULTI ` ] ( https://redis.io/commands/multi ) 命令后可以输入多个命令, Redis 不会立即执行这些命令,而是将它们放到队列,当调用了 [ ` EXEC ` ] ( https://redis.io/commands/exec ) 命令后,再执行所有的命令 。
3434
3535这个过程是这样的:
3636
37- 1 . 开始事务(` MULTI ` )。
38- 2 . 命令入队(批量操作 Redis 的命令,先进先出(FIFO)的顺序执行)。
37+ 1 . 开始事务(` MULTI ` );
38+ 2 . 命令入队(批量操作 Redis 的命令,先进先出(FIFO)的顺序执行);
39393 . 执行事务(` EXEC ` )。
4040
4141你也可以通过 [ ` DISCARD ` ] ( https://redis.io/commands/discard ) 命令取消一个事务,它会清空事务队列中保存的所有命令。
4242
4343``` bash
4444> MULTI
4545OK
46- > SET USER " Guide哥 "
46+ > SET PROJECT " JavaGuide "
4747QUEUED
48- > GET USER
48+ > GET PROJECT
4949QUEUED
5050> DISCARD
5151OK
5252```
5353
54- [ ` WATCH ` ] ( https://redis.io/commands/watch ) 命令用于监听指定的键,当调用 ` EXEC ` 命令执行事务时,如果一个被 ` WATCH ` 命令监视的键被修改的话,整个事务都不会执行,直接返回失败。
54+ 你可以通过[ ` WATCH ` ] ( https://redis.io/commands/watch ) 命令监听指定的 Key,当调用 ` EXEC ` 命令执行事务时,如果一个被 ` WATCH ` 命令监视的 Key 被 ** 其他客户端/Session** 修改的话,整个事务都不会被执行。
55+
56+ ``` bash
57+ # 客户端 1
58+ > SET PROJECT " RustGuide"
59+ OK
60+ > WATCH PROJECT
61+ OK
62+ > MULTI
63+ OK
64+ > SET PROJECT " JavaGuide"
65+ QUEUED
66+
67+ # 客户端 2
68+ # 在客户端 1 执行 EXEC 命令提交事务之前修改 PROJECT 的值
69+ > SET PROJECT " GoGuide"
70+
71+ # 客户端 1
72+ # 修改失败,因为 PROJECT 的值被客户端2修改了
73+ > EXEC
74+ (nil)
75+ > GET PROJECT
76+ " GoGuide"
77+ ```
78+
79+ 不过,如果 ** WATCH** 与 ** 事务** 在同一个 Session 里,并且被 ** WATCH** 监视的 Key 被修改的操作发生在事务内部,这个事务是可以被执行成功的(相关 issue :[ WATCH 命令碰到 MULTI 命令时的不同效果] ( https://github.com/Snailclimb/JavaGuide/issues/1714 ) )。
80+
81+ 事务内部修改 WATCH 监视的 Key:
5582
5683``` bash
57- > WATCH USER
84+ > SET PROJECT " JavaGuide"
85+ OK
86+ > WATCH PROJECT
87+ OK
88+ > MULTI
89+ OK
90+ > SET PROJECT " JavaGuide1"
91+ QUEUED
92+ > SET PROJECT " JavaGuide2"
93+ QUEUED
94+ > SET PROJECT " JavaGuide3"
95+ QUEUED
96+ > EXEC
97+ 1) OK
98+ 2) OK
99+ 3) OK
100+ 127.0.0.1:6379> GET PROJECT
101+ " JavaGuide3"
102+ ```
103+
104+ 事务外部修改 WATCH 监视的 Key:
105+
106+ ``` bash
107+ > SET PROJECT " JavaGuide"
108+ OK
109+ > WATCH PROJECT
110+ OK
111+ > SET PROJECT " JavaGuide2"
58112OK
59113> MULTI
60- > SET USER " Guide哥"
61114OK
62115> GET USER
63- Guide哥
116+ QUEUED
64117> EXEC
65- ERR EXEC without MULTI
118+ (nil)
66119```
67120
68121Redis 官网相关介绍 [ https://redis.io/topics/transactions ] ( https://redis.io/topics/transactions ) 如下:
0 commit comments