一、官网
二、介绍
可以一次性执行多个命令,本质是一组命令的集合。一个事务中,所有命令都会序列化,按顺序的串行化执行,不会别其他命令插入,不允许加塞。
一个队列中,一次性、顺序性、排他性的执行一系列命令。
特点:
特点 | 描述 |
---|---|
单独的隔离操作 | Redis 的事务仅仅是保证事务里的操作会被连续独占的执行,Redis 命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的 |
没有隔离级别的概念 | 因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了 |
不保证原子性 | Redis 的事务 不保证原子性 ,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力 |
排它性 | Redis 会保证一个事务内的命令依次执行,而不会被其它命令插入 |
三、事务命令
命令 | 描述 |
---|---|
MULTI | 标记一个事务块的开始。 |
EXEC | 执行所有事务块内的命令。 |
DISCARD | 取消事务,放弃执行事务块内的所有命令。 |
WATCH key [key …] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
UNWATCH | 取消 WATCH 命令对所有 key 的监视。 |
四、五大案例类型
1、正常执行
关键字: MULTI
, EXEC
# 测试案例如下:
MULTI
set k1 v1
set k2 v2
set k3 v3
set ···
EXEC
如图所示,可以获取 k3
的值。所以,事务已经正常执行。
2、取消事务
关键字: MULTI
, DISCARD
# 测试案例如下:
MULTI
set k1 v11
set k2 v22
set k3 v33
set ···
DISCARD
如图所示,k3
的值仍为 v3
。所以,事务已经取消。
3、全体连坐
如果一个有错误,则全都不执行。
关键字: MULTI
, EXEC
# 测试案例如下:
MULTI
set k1 v111
set k2 v222
set k3
set ···
EXEC
一荣俱荣,一损俱损。覆巢之下,岂有完卵!
4、冤头债主
当有的命令有错误,不影响其他正确的命令继续执行。由此可见, Redis
不是绝对的事务一致性。同时也 没有回滚 机制。
关键字: MULTI
, EXEC
# 测试案例如下:
MULTI
set k1 v111
set k2 v222
set INCR k3
set ···
EXEC
如图所示,发现 Redis
和传统数据库事务上的区别, Redis
不一定必须一起成功一起失败。
5、WATCH监控
悲观锁: 悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。
乐观锁: 乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据。如果别人在此期间修改了数据则放弃操作,否则执行操作。
乐观锁策略: 提交版本必须 大于 记录当前版本才能执行更新。
Redis
使用 WATCH
来提供 乐观锁 ,用于为 Redis
事务提供检查和设置,类似于 CAS(check-and-set)
行为。 key
被监控,以便检测它的变化。如果在执行 EXEC
命令之前至少修改了一个 key
所对应的 value
,那么整个事务将终止,EXEC
返回一个 Null
应答来通知事务失败。
开启监控测试案例:
关闭监控测试案例:
拓展:
(1)一旦执行了 EXEC
,之前添加的监控锁都会被取消掉。
(2)当客户端连接丢失(比如退出连接),所有的 key
都会被取消监控。
五、总结
1、开启事务:MULTI
2、将多个命令放到队列中。这些命令并不会被执行,而是放到等待执行的队列中。
3、触发事务:EXEC
到这里 Redis 7事务 就结束了!!!🎉🎉🎉
欢迎小伙伴们学习和指正!!!😊😊😊
祝大家学习和工作一切顺利!!!😎😎😎