官方介绍MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令,事务可以一次执行多个命令,但是必须满足2个条件:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。执行和是否成功是2个概念,并不是一个失败报错等,其他就失败。redis对事务是部分支持。如果最开始语法等就有提交错误,就相当于java的编译器都过不了,那么肯定全部不执行(见图一)。如果在执行过程中报错,已经全部执行了,但是谁报错找谁,其他正常执行放行(图二)。各取所需!这里的事务并不是要么全部成功,要么全部失败,全部执行和全部成功(或者都失败)是2个概念。
MULTI 开启事务,总是返回OK,EXEC 提交事务,DISCARD放弃事务(放弃提交执行),WATCH监控
QUEUED是将命令加入执行的队列
图一:
图二:
K1的value不是数字,执行时候报错,其他不影响,都执行了命令
DISCARD取消事务:
127.0.0.1:6379> set k1 k1
OK
127.0.0.1:6379> set k2 k2
OK
127.0.0.1:6379> set k3 k3
OK
127.0.0.1:6379> set k4 k4
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 11
QUEUED
127.0.0.1:6379> set k2 22
QUEUED
127.0.0.1:6379> set k3 33
QUEUED
127.0.0.1:6379> set k4 44
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
4) "k4"
127.0.0.1:6379> get k1
"k1"
127.0.0.1:6379> get k2
"k2"
127.0.0.1:6379> get k3
"k3"
127.0.0.1:6379> get k4
"k4"
127.0.0.1:6379>
WATCH监控:比如信用卡有100的额度,刷了20后,就欠额20,额度还有80,就需要这2次操作都在一个事 务中,要么2个都成功,要么2个操作都失败。
成功,保证都在一个事务中
如果中间被其他人改动了怎么办呢?
中途被其他人修改了,自己的事务失败了,这个时候就需要使用UNWATCH,放弃本次监控,重新来过(重新获值再去修 改),乐观锁
作者:ypp91zr
来源:CSDN
原文:https://blog.csdn.net/ypp91zr/article/details/69487648?utm_source=copy