需要特别注意,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. 驱动开发:内核枚举DpcTimer定时器

    在笔者上一篇文章<驱动开发:内核枚举IoTimer定时器>中我们通过IoInitializeTimer这个API函数为跳板,向下扫描特征码获取到了IopTimerQueueHead也就是I ...

  2. Linux 下搭建 Hadoop 环境

    Linux 下搭建 Hadoop 环境 作者:Grey 原文地址: 博客园:Linux 下搭建 Hadoop 环境 CSDN:Linux 下搭建 Hadoop 环境 环境要求 操作系统:CentOS ...

  3. Ubuntu安装错误 server64 busybox-initramfs安装失败

    因为想试试在Linux系统上爆破 所以安装了一下Ubuntu.第一次安装包报了个server64 busybox-initramfs.在安装系统那边.我一直还以为是我磁盘分配错了. 后来在网上找了资料 ...

  4. Vue学习之---浏览器本地存储(8/17)

    博客园(纯干货):https://www.cnblogs.com/zheng-yuzhu/ 文章目录 1.基础知识 2.代码实例(localStorage.html) 3.测试效果 4.代码实例(se ...

  5. Python学习笔记----操作字符串

    1.字符串相加.列表相加.列表和字符串不能混着使用 #序列相加 a="hello" b="python" c=a+b print("字符串相加的结果& ...

  6. 微服务开发框架-----Apache Dubbo

    文章目录 一.简介 二.概念与架构 一.简介 Apache Dubbo 是一款微服务开发框架,提供了RPC通信与微服务治理两大关键能力.使用Dubbo开发的微服务,将具备相互之间的远程发现与通信能力, ...

  7. GitLab CI/CD 自动化部署入门

    前言:因为找了B站内推,测试开发,正好知道内部使用GitLab做自动化测试,所以简单学了一下,有错误的地方请指正. 入门 初始化 cp: 无法获取'/root/node-v12.9.0-linux-x ...

  8. Java Timer使用介绍

    java.util包下提供了对定时任务的支持,涉及2个类: Timer:定时器类 TimerTask:任务抽象类 使用该定时任务我们需要继承TimerTask抽象类,覆盖run方法编写任务执行代码,并 ...

  9. springboot前端向后端请求返回html语句

    后端接口代码 @PostMapping("/service/confirmPay") @ResponseBody public GlobalResponse confirmPay( ...

  10. NC 使用Nginx实现https的反向代理

    summary: [通过Nginx实现NCC的https访问,并解决UClient应用的问题] 1 概述 通过Nginx 安装配置反向代理,实现NC.NCC的https访问. 本文以NCC2005为例 ...