当前位置: 首页 > 工具软件 > Keywatch > 使用案例 >

大数据之Redis:watch key 和unwatch

薛欣德
2023-12-01

1、watch key

在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

2、使用watch

案例一:使用watch检测balance,事务期间balance数据未变动,事务执行成功

27.0.0.1:6379> watch balance#检测可用余额数,初始值为100
OK
127.0.0.1:6379> MULTI# 开启事务
ok
127.0.0.1:6379> decrby balance 20#消费20后,可用余额-20
QUEUED
127.0.0.1:6379>incrby debt 20#应还余额+20
QUEUED
127.0.0.1:6379> EXEC# 执行事务
1)(integer)80 
2)(integer)20

案例二:使用watch检测balance,在开启事务后(标注1处),在新窗口执行标注2的操作,更改balance的值,模拟其他客户端在事务执行期间更改watch监控的数据,然后再执行标注1后命令,执行EXEC后,事务未成功执行。

```powershell
27.0.0.1:6379> watch balance#检测balance的值,初始为为80
OK
127.0.0.1:6379> MULTI# 开启事务(标注1)
ok
127.0.0.1:6379> decrby balance 20#可用余额-20
QUEUED
127.0.0.1:6379>incrby debt 20#应还余额+20
QUEUED
127.0.0.1:6379> EXEC# 执行事务
(nil)#事务失败
127.0.0.1:6379>get balance 
"800"
127.0.0.1:6379>get balance #查看balance值
"80"
127.0.0.1:6379>set balance 800 #修改balance值
ok

watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。

3、unwatch

取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了

4、三特性

单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

没有隔离级别的概念
队列中的命令没有提交(exec)之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题 ;

不保证原子性
Redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

 类似资料: