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 事务失效或取消执行命令的场景相关推荐

  1. Redis事务失效的三种场景

    文章目录 Redis 事务失效的三种场景 命令入队报错 命令执行报错 乐观锁导致失效 Redis 事务失效的三种场景 Redis事务失败,有三种类型的失败场景: 命令入队报错 在事务提交之前,客户端执 ...

  2. 详解spring事务失效和回滚失败的场景

    详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...

  3. Redis基本使用|基本命令|redis事务|Jedis|持久化|订阅|集群|

    文章目录 Redis ! 一.概述 二.安装 三.实操 1.性能测试 2.基础知识 3.基本key命令 4.基本数据类型 1.String 2.List 3.Set 4.Hash 5.Zset 5.特 ...

  4. subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行?

    redis的基本操作指令就不多说了,今天对redis的进阶操作给大家介绍一下,以及对于jedis和redisTemplate等工具包没有封装的命令我们该如何使用?相信大家读了本篇对redis的整体会有 ...

  5. Redis事务入门及命令

    文章目录 Redis 事务入门及命令 事务概念 Redis 事务概念 Redis 事务特性 Redis 三个阶段 入门代码示例 Redis 相关命令 MULTI DISCARD EXEC WATCH ...

  6. redis setnx原子性_不支持原子性的 Redis 事务也叫事务吗?

    文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 假设现在有这样一个业务,用户获取的某些数据来自第三方接口信息,为避免频繁请求第三方接口,我们往往会加一层缓存,缓存肯定要 ...

  7. redis学习-redis事务

    是什么 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 一次执行多个redis命令. 能干嘛 一个队列中,一次性.顺序性 ...

  8. 分布式缓存架构(3)-Redis事务主从复制哨兵机制

    Redis的主从复制 概述: redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库,一类是从数据库,主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是 ...

  9. 十七、Redis事务

    一.Redis事务的概念: Redis 事务的本质是一组命令的集合.事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求 ...

最新文章

  1. LTE-怎么获取上行资源
  2. 2021全国高校计算机能力挑战赛(初赛)C语言试题四
  3. p-unit - 单元级别开源性能测试框架
  4. js 之 object
  5. hdu1316 大数
  6. 动物麻醉剂量和途径相关要点
  7. 【简便代码】1082 射击比赛 (20分)_17行代码AC
  8. SPH(光滑粒子流体动力学)流体模拟实现七:屏幕空间流体渲染(SSF)
  9. [原]go lang windows环境搭建
  10. [LeetCode]题解(python):038-Count and Say
  11. 从微软重返诺基亚:Juha Alakarhu是何许人也?
  12. java uml建模工具 apk,UML建模工具(Astah Professional)
  13. 分而治之,大型文件分片上传
  14. Android学习-使用WebView在app上显示网页
  15. android照片备份软件下载,照片备份云相册app-照片备份云相册安卓版下载v1.5-乐游网安卓下载...
  16. 英特尔卖了通信与手机处理器,中国厂商是哭还是笑?
  17. MySQL的时间戳2038年问题还有16年,最好在设计上的时候使用datetime就可以了,不要使用时间戳字段了,即使用了也不要用int类型进行映射,使用long类型映射即可
  18. 宝莱坞机器人 西瓜_《宝莱坞机器人之恋》电影完整版免费在线观看_2010西瓜影音 - 辛集电影院...
  19. Python 数据科学入门教程:Matplotlib
  20. 匈牙利命名法、驼峰式命名法、帕斯卡命名法、下划线命名法

热门文章

  1. 不允许清除应用的数据
  2. 微软小冰推出“虚拟版”微信!比原版更好玩
  3. html5 canvas 画一个矩形,在矩形里添加文字。
  4. 二叉树 奇偶行输出方向相反_二叉树中的奇偶级差
  5. iOS math.h 常用数学函数
  6. MAC下的word里面照片突然不能在线裁剪,裁剪框变成了灰色;
  7. 教程1-什么是编程?
  8. 【千律】C++基础:map 循环遍历删除元素,及其报错的解决方案
  9. numpy 数据类型转换
  10. 小米新款打开高通Diagnostics端口提取的基带qcn文件改串号