当前位置: 首页 > news >正文

Redis到底支不支持事务?

文章目录

  • 一、概述
  • 二、使用
    • 1、正常执行:
    • 2、主动放弃事务
    • 3、全部回滚:
    • 4、部分支持事务:
    • 5、WATCH:
  • 三、事务三阶段
  • 四、小结

redis是支持事务的,但是它与传统的关系型数据库中的事务是有所不同的

一、概述

概念: 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。常用命令:

  • multi: 开启一个事务,multi 执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中。
  • exec:执行队列中所有的命令
  • discard:中断当前事务,然后清空事务队列并放弃执行事务
    监视一个(或多个)key ,如果在事务执行之前这个(或这些) key 被其
  • watch key1 key2 …他命令所改动,那么事务将被打断

二、使用

1、正常执行:

在这里插入图片描述

2、主动放弃事务

使用 discard 主动中断 multi 操作,然后清空并放弃执行当前事务

在这里插入图片描述

3、全部回滚:

开启 multi 之后,命令语法导致执行错误,会放弃当前所有队列中的命令
在这里插入图片描述

4、部分支持事务:

开启 multi 之后,命令逻辑执行错误,会主动忽略报错语句,继续执行后续命令
在这里插入图片描述

5、WATCH:

Redis 的 watch 命令是一种乐观锁的实现方式。余额修改示例:
正常情况:
在这里插入图片描述
并发修改情况:
在这里插入图片描述
在 watch 监控后,有人修改了balance,会导致事务会被打断,必须更新最新值,才能成功执行事务,类似于乐观锁的版本号机制。

三、事务三阶段

1、开启:以 multi 开始一个事务
2、入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
3、执行:由 exec 命令触发事务

四、小结

Redis 事务区别于关系型数据库在于

1.原子性:Redis 事务保证的是队列中的命令作为一个整体要么全部执行,要么全部不执行。但是,如果事务中的某个命令因为执行错误而失败,Redis 会继续执行事务中的其他命令,而不是回滚整个事务。

2.无隔离级别: Redis 事务中的命令在提交前不会被实际执行,因此不存在传统数据库中的事务隔离级别问题,如脏读、不可重复读或幻读

3.命令队列: 当客户端发送 multi 命令后,所有随后的命令都会被放入一个队列中,而不是立即执行。当 exec 命令被发送时,Redis 会尝试执行队列中的所有命令。

4.乐观锁: Redis 使用 watch 命令来实现乐观锁机制。客户端可以监控一个或多个键,如果在执行 exec 之前这些键的值被其他客户端改变,事务将不会执行

5.自动放弃: 如果事务因为监控键被修改而不能执行,exec 命令将放弃当前队列命令,返回null .

6.discard 命令: 如果客户端在发送 multi 之后决定放弃事务,可以使用discard 命令来清空事务队列并退出事务状态。

7.有限的回滚: Redis 事务不支持命令级别的回滚。如果事务中的某个命令失败,Redis 会停止执行后续命令,而不是回滚到事务开始前的状态

相关文章:

  • MySQL 存储函数及调用
  • C语言 | Leetcode C语言题解之第142题环形链表II
  • Position定位
  • 深度学习之文本分类模型-基于transformer
  • Spring Web MVC入门
  • AI服务器相关知识
  • 有趣的数学 为什么绝对值和模都用两个竖线表示?
  • Python with语句
  • 大数据运维学习笔记之flink standalone flink on yarn集群搭建 —— 筑梦之路
  • AI作画工具介绍
  • 容器是什么?
  • 【linux】(6)文本处理sed
  • 《软件定义安全》之一:SDN和NFV:下一代网络的变革
  • Python Flask实现蓝图Blueprint配置和模块渲染
  • 【Python报错】已解决FileNotFoundError: [Errno 2] No such file or directory: ‘xxx‘
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 0x05 Python数据分析,Anaconda八斩刀
  • Git学习与使用心得(1)—— 初始化
  • HTML5新特性总结
  • java第三方包学习之lombok
  • Ruby 2.x 源代码分析:扩展 概述
  • SQLServer之索引简介
  • V4L2视频输入框架概述
  • windows下mongoDB的环境配置
  • 读懂package.json -- 依赖管理
  • 机器学习中为什么要做归一化normalization
  • 基于Android乐音识别(2)
  • 聊聊flink的TableFactory
  • 前端相关框架总和
  • 使用 Docker 部署 Spring Boot项目
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 一份游戏开发学习路线
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​低代码平台的核心价值与优势
  • ​虚拟化系列介绍(十)
  • ${factoryList }后面有空格不影响
  • (2)MFC+openGL单文档框架glFrame
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)共用体union的用法举例
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (一)基于IDEA的JAVA基础1
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net和jar包windows服务部署
  • .NET基础篇——反射的奥妙
  • .NET未来路在何方?
  • :O)修改linux硬件时间
  • @DS 多数据源 + @Transactional(rollbackFor = Exception.class) 导致@DS 多数据源没法使用
  • @RequestBody与@ModelAttribute
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——