Redis 事务失效或取消执行命令的场景
1 概述
(1)Redis 事务失效的场景:
事务中的部分命令执行失败
(2)Redis 取消执行事务中的所有命令(Redis清空队列中的全部命令并取消事务)的场景:
部分命令入队失败、乐观锁失败
2 事务中的部分命令执行失败
事务提交后开始顺序执行命令,之前缓存在队列中的部分命令执行失败,但事务不会自动回滚,从而导致事务失效。
示例代码如下:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name jack
QUEUED
127.0.0.1:6379> set age 16
QUEUED
127.0.0.1:6379> lpush age 18
QUEUED
127.0.0.1:6379> exec # 提交事务后开始顺序执行命令,第三条命令执行失败
1) OK
2) OK
3) (error) WRONGTYPE Operation against a key holding the wrong kind of value # key重复导致命令执行失败
127.0.0.1:6379> get name # 第三条命令执行失败,但没有将前两条命令回滚
"jack"
3 部分命令入队失败
在事务提交之前,客户端执行的命令入队列失败,比如命令的语法错误(命令参数个数错误,不支持的命令等等)。
如果发生这种类型的错误,Redis将向客户端返回包含错误提示信息的响应,同时Redis会清空队列中的所有命令并取消事务。
示例代码如下:
127.0.0.1:6379> set name jack # 事务之前执行
OK
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set name lily # 事务中执行,命令入队列
QUEUED
127.0.0.1:6379> setset name lucy # 错误的命令,模拟失败场景
(error) ERR unknown command `setset`, with args beginning with: `name`, `lucy`,127.0.0.1:6379> exec # 提交事务,发现由于上条命令的错误导致事务已经自动取消了
(error) EXECABORT Transaction discarded because of previous errors.127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> get name # 查询name,发现未被修改
"jack"
4 乐观锁失败
Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
watch 监控 key 所起的作用实际上是一个乐观锁,它所监控的是在事务期间所监控的值有没有被修改,如果被修改了,说明乐观锁失败。
由于乐观锁失败,事务提交时将丢弃之前缓存的所有命令。
(1)在事务执行之前 key 没有被其他命令所改动,事务中的命令执行成功。
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
"jack"
127.0.0.1:6379> watch name # watch 给name加乐观锁
OK
127.0.0.1:6379> multi # 在事务执行之前 key 没有被其他命令所改动
OK
127.0.0.1:6379> set name tom
QUEUED
127.0.0.1:6379> exec #
1) OK
127.0.0.1:6379> get name
"tom"
(2)在事务执行之前 key 被其他命令所改动,事务提交时将丢弃之前缓存的所有命令,事务中的命令执行失败。
127.0.0.1:6379> set name lily
OK
127.0.0.1:6379> get name
"lily"
127.0.0.1:6379> watch name # watch 给name加乐观锁
OK
127.0.0.1:6379> set name tom # 修改name的值
OK
127.0.0.1:6379> get name
"tom"
127.0.0.1:6379> multi # 在事务执行之前 key 被其他命令所改动
OK
127.0.0.1:6379> set name jack
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get name
"tom"
5 参考文献
(1)Redis事务失效的三种场景
Redis 事务失效或取消执行命令的场景相关推荐
- Redis事务失效的三种场景
文章目录 Redis 事务失效的三种场景 命令入队报错 命令执行报错 乐观锁导致失效 Redis 事务失效的三种场景 Redis事务失败,有三种类型的失败场景: 命令入队报错 在事务提交之前,客户端执 ...
- 详解spring事务失效和回滚失败的场景
详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...
- Redis基本使用|基本命令|redis事务|Jedis|持久化|订阅|集群|
文章目录 Redis ! 一.概述 二.安装 三.实操 1.性能测试 2.基础知识 3.基本key命令 4.基本数据类型 1.String 2.List 3.Set 4.Hash 5.Zset 5.特 ...
- subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行?
redis的基本操作指令就不多说了,今天对redis的进阶操作给大家介绍一下,以及对于jedis和redisTemplate等工具包没有封装的命令我们该如何使用?相信大家读了本篇对redis的整体会有 ...
- Redis事务入门及命令
文章目录 Redis 事务入门及命令 事务概念 Redis 事务概念 Redis 事务特性 Redis 三个阶段 入门代码示例 Redis 相关命令 MULTI DISCARD EXEC WATCH ...
- redis setnx原子性_不支持原子性的 Redis 事务也叫事务吗?
文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 假设现在有这样一个业务,用户获取的某些数据来自第三方接口信息,为避免频繁请求第三方接口,我们往往会加一层缓存,缓存肯定要 ...
- redis学习-redis事务
是什么 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 一次执行多个redis命令. 能干嘛 一个队列中,一次性.顺序性 ...
- 分布式缓存架构(3)-Redis事务主从复制哨兵机制
Redis的主从复制 概述: redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库,一类是从数据库,主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是 ...
- 十七、Redis事务
一.Redis事务的概念: Redis 事务的本质是一组命令的集合.事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求 ...
最新文章
- LTE-怎么获取上行资源
- 2021全国高校计算机能力挑战赛(初赛)C语言试题四
- p-unit - 单元级别开源性能测试框架
- js 之 object
- hdu1316 大数
- 动物麻醉剂量和途径相关要点
- 【简便代码】1082 射击比赛 (20分)_17行代码AC
- SPH(光滑粒子流体动力学)流体模拟实现七:屏幕空间流体渲染(SSF)
- [原]go lang windows环境搭建
- [LeetCode]题解(python):038-Count and Say
- 从微软重返诺基亚:Juha Alakarhu是何许人也?
- java uml建模工具 apk,UML建模工具(Astah Professional)
- 分而治之,大型文件分片上传
- Android学习-使用WebView在app上显示网页
- android照片备份软件下载,照片备份云相册app-照片备份云相册安卓版下载v1.5-乐游网安卓下载...
- 英特尔卖了通信与手机处理器,中国厂商是哭还是笑?
- MySQL的时间戳2038年问题还有16年,最好在设计上的时候使用datetime就可以了,不要使用时间戳字段了,即使用了也不要用int类型进行映射,使用long类型映射即可
- 宝莱坞机器人 西瓜_《宝莱坞机器人之恋》电影完整版免费在线观看_2010西瓜影音 - 辛集电影院...
- Python 数据科学入门教程:Matplotlib
- 匈牙利命名法、驼峰式命名法、帕斯卡命名法、下划线命名法