需要特别注意,Redis 的命令是原子性的,而 Redis 的事务是非原子性的

事务相关命令

MULTI 命令

开启事务命令,Redis将操作命令逐个放到队列中,根据EXEC命令来原子化执行命令

EXEC 命令

执行事务中的所有操作命令

DISCARD 命令

取消事务命令,放弃执行事务模块中的所有命令

WATCH 命令

监视一个 key 或者多个 key 如果在事务执行前,这些 key 被其他命令修改,则事务被中断,不会执行事务中的任何命令

UNWATCH 命令

取消 WATCH 命令对所有 key 的监控

事务流程

正常事务流程

使用MULTI 命令开启一个事务,并且使用 set 命令新建两个字符串键 key1key2,初始值分别为 val1val2

127.0.0.1:6379> set key1 val1
OK
127.0.0.1:6379> set key2 val2
OK

然后我们使用一个事务来修改两个 key 的值,命令为

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key1 new_val1
QUEUED
127.0.0.1:6379> set key2 new_val2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK

最后我们使用get命令来查询我们修改的键

127.0.0.1:6379> get key1
"new_val1"
127.0.0.1:6379> get key2
"new_val2"
127.0.0.1:6379>

可以看到外面已经修改了两个键的值

语法错误导致事务失败流程

在事务开启后,其中某一条命令因为 redis 语法错误导致整个事务提交失败,key 的值不会发生改变

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set key1 new_val1
QUEUED
127.0.0.1:6379(TX)> sets key2 new_val2
(error) ERR unknown command `sets`, with args beginning with: `key2`, `new_val2`,
127.0.0.1:6379(TX)> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get key1
"val1"
127.0.0.1:6379> get key2
"val2"

数据类型错误导致事务失败流程

在事务开启后,其中某一条命令因为 redis 数据类型错误导致整个事务提交失败,发生类型错误的命令的 key 的值不会发生改变,但是其他 key 会发生变化

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set key1 val1
QUEUED
127.0.0.1:6379(TX)> lpush key2 val2
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get key1
"val1"
127.0.0.1:6379> get key2
"new_val2"
127.0.0.1:6379>

Redis-03 Redis事务的更多相关文章

  1. 【Redis】Redis事务详解,Redis事务支持回滚(不支持悲观锁)

    1.redis事物参考:https://baijiahao.baidu.com/s?id=1613631210471699441&wfr=spider&for=pc (php操作red ...

  2. Redis系列之key操作命令与Redis中的事务详解(六)

    序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力. 2.掌握redis中的事务,让你的数据完整性一致性拥有更优的保障. redis命 ...

  3. Redis 中的事务

    Redis支持简单的事务 Redis与mysql事务的对比 Mysql Redis 开启 start transaction muitl 语句 普通sql 普通命令 失败 rollback 回滚 di ...

  4. redis中的事务

    首先明白在java中线程和进程的区别: 1.什么是多线程? 是指一个应用程序同时执行多个任务,一般来说一个任务就是一个线程 ,而一个应用程序有一个以上的线程我们称之为多线程. 2.什么是进程? 进程是 ...

  5. Redis 学习(三) —— 事务、消息发布订阅

    一.Redis事务 Redis 提供的事务机制与传统的数据库事务有些不同,传统数据库事务必须维护以下特性:原子性(Atomicity), 一致性(Consistency),隔离性(Isolation) ...

  6. Redis(十一):Redis的事务功能详解

    相关命令 1. MULTI 用于标记事务块的开始.Redis会将后续的命令逐个放入队列中,然后才能使用EXEC命令原子化地执行这个命令序列. 这个命令的运行格式如下所示: MULTI 这个命令的返回值 ...

  7. Redis数据库 02事务| 持久化| 主从复制| 集群

    1. Redis事务 Redis不支持事务,此事务不是关系型数据库中的事务: Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的 ...

  8. 三、redis系列之事务

    1. 绪言 Redis也提供了事务机制,可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞.但Redis对事务的支持是部分支持 ...

  9. redis的简单事务

    Redis对事务的支持目前还比较简单.Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令.当一个client在一个连接中发出multi命令时,这个 ...

  10. 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存

    原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...

随机推荐

  1. Java学习之路:Dos命令

    2022-10-08  10:25:42 (一)打开CMD的方式 开始+系统+命令提示符 Win+R  输入cmd打开控制台 在任意的文件夹下面,按住Shift+鼠标右键,点击在此打开命令行窗口 资源 ...

  2. 『现学现忘』Git基础 — 36、标签tag(一)

    目录 1.标签介绍 2.列出标签 3.创建标签 (1)标签的分类 (2)附注标签 (3)轻量标签 4.后期打标签 1.标签介绍 软件的某个发行版本所对应的,其实就是软件开发过程中,某一个阶段的最后一次 ...

  3. 使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)

    文章目录 1.代码 2.测试结果 2.1.第一次发送 2.2.填写正确的验证码 2.3.填写错误的验证码 连续发送多次验证码 环境准备:虚拟机Linux系统,redis安装在虚拟机中. 前提条件:虚拟 ...

  4. 记一次 .NET 某娱乐聊天流平台 CPU 爆高分析

    一:背景 1.讲故事 前段时间有位朋友加微信,说他的程序直接 CPU=100%,每次只能手工介入重启,让我帮忙看下到底怎么回事,哈哈,这种CPU打满的事故,程序员压力会非常大, 我让朋友在 CPU 高 ...

  5. 『现学现忘』Git分支 — 41、分支基本操作(二)

    目录 6.新建一个分支并且使分支指向指定的提交对象 7.思考: 8.项目分叉历史的形成 9.分支的总结 提示:接上篇 6.新建一个分支并且使分支指向指定的提交对象 使用命令:git branch br ...

  6. Vitepress搭建组件库文档(上)—— 基本配置

    在 vite 出现以前,vuepress 是搭建组件库文档不错的工具,支持以 Markdown 方式编写文档.伴随着 vite 的发展,vitepress 已经到了 1.0.0-alpha.22 版本 ...

  7. 题解 CF1011B Planning The Expedition

    Solution 考虑 二分 . 首先要确定二分的对象,显然二分天数较为简单. 每次找到的 \(mid\) 需要判断是否能让整队人吃饱,那就调用一个 check() . 对于 check() ,求出每 ...

  8. Java 动态代理原理图解 (附:2种实现方式详细对比)

    ​ 动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询.以及 RPC Dubbo 远程调用等,都有非常多的实际应用@mikechen 目录 ...

  9. webpack4--按需加载

    在做单页面应用的过程中,通常利用webpack打包文件,将依赖的外部问价单独打一个vendor.js.这样就会有个问题,这个文件会随着你引用的包的增多,体积会越来越大.在路由中利用import 引用文 ...

  10. 记一次线上频繁fullGc的排查解决过程

    发生背景 最近上线的一个项目几乎全是查询业务,并且都是大表的慢查询,sql优化是做了一轮又一轮,前几天用户反馈页面加载过慢还时不时的会timeout,但是我们把对应的sql都优化一遍过后,前台响应还是 ...