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

Redis有事务吗,和关系型如mysql数据库事务有什么区别

Redis是有事务的,redis中的事务是一组命令的集合,这组命令要么都执行,要不都不执行,
redis事务的实现,需要用到MULTI(事务的开始)和EXEC(事务的结束)命令 ;
在这里插入图片描述
当输入MULTI命令后,服务器返回OK表示事务开始成功,然后依次输入需要在本次事务中执行的所有命令,每次输入一个命令服务器并不会马上执行,而是返回”QUEUED”,这表示命令已经被服务器接受并且暂时保存起来,最后输入EXEC命令后,本次事务中的所有命令才会被依次执行,可以看到最后服务器一次性返回了两个OK,这里返回的结果与发送的命令是按顺序一一对应的,这说明这次事务中的命令全都执行成功了。
Redis的事务除了保证所有命令要不全部执行,要不全部不执行外,还能保证一个事务中的命令依次执行而不被其他命令插入。同时,redis的事务是不支持回滚操作的。


Redis 支持事务(Transaction)功能,但它的事务机制与关系型数据库(如 MySQL)中的事务有所不同。

一、Redis 事务的基本概念

在 Redis 中,事务允许你将多个命令打包在一起,一次性、按顺序地执行,并且在执行过程中不会被其他客户端的命令插入(即具有原子性执行的特点)

Redis 事务主要通过以下几个命令实现:

  • MULTI:标记一个事务块的开始。
  • EXEC:执行所有事务块内的命令。
  • DISCARD:取消事务,放弃执行事务块内的所有命令。
  • WATCH:监视一个或多个 key,如果在事务执行之前这些 key 被其他客户端修改,则事务将被打断(提供一个乐观锁的机制)。

二、Redis 事务的执行流程示例

MULTI
SET name "Alice"
INCR age
EXEC

解释:

  1. MULTI:表示开始一个事务。
  2. 接下来输入的所有命令(如 SET, INCR 等)会被放入队列中,但不会立即执行
  3. EXEC:执行队列中的所有命令。这些命令会按照顺序执行,且在执行期间不会被其他客户端的命令打断
  4. 如果使用了 DISCARD,则所有放在事务队列里的命令都会被丢弃,不会执行。

三、Redis 事务的特点

✅ 1. 一次性、顺序执行

事务中的所有命令会按顺序打包并一次性执行,不会被其他命令插入。

❌ 2. 不支持回滚(Rollback)

Redis 的事务不提供传统意义上的回滚机制。即使事务中的某个命令执行失败(比如对一个字符串执行 INCR),其他命令仍然会继续执行。也就是说,Redis 事务只保证命令依次执行,但不做错误回滚

举个例子:

MULTI
SET name "Bob"
INCR name   # name 是字符串,对字符串执行 INCR 会报错
EXEC

在这里插入图片描述

结果:

  • SET name "Bob" 会成功执行。
  • INCR name 会执行失败(因为 name 不是数字)。
  • 但整个事务不会回滚,SET 操作依然生效!

所以,Redis 的事务更强调的是“命令的批量执行与隔离执行”,而不是“事务的 ACID 完整性”

✅ 3. 隔离性

事务执行过程中,其他客户端的命令不会插入到事务命令中间,保证了事务的隔离性。

✅ 4. 提供了乐观锁:WATCH 命令

Redis 提供了 WATCH 命令来实现乐观锁机制,常用于实现并发控制。

用法示例(伪代码逻辑):

WATCH balance
# 假设 balance 是某个账户余额的 key
# 检查并扣减余额的逻辑...
MULTI
DECRBY balance 100
EXEC
  • 如果在 WATCH balance 之后、EXEC 之前,其他客户端修改了 balance,那么当前客户端的事务(EXEC)将执行失败(返回 nil),表示数据已经被修改,你需要重试。
  • 如果没有发生修改,则事务正常执行。

这是一种轻量级的并发控制手段,适用于实现类似“CAS(Compare And Set)”的操作。


四、Redis 事务 vs 关系型数据库事务

特性Redis 事务关系型数据库事务(如 MySQL)
原子性命令顺序执行,但部分失败不影响其他命令支持真正的原子性,要么全部成功,要么全部回滚
一致性依赖命令正确性,不自动回滚通过回滚等机制保证一致性
隔离性事务执行时不被打扰通过锁或 MVCC 实现隔离级别
持久性取决于配置(如 RDB / AOF)通常支持持久化
回滚机制不支持(命令出错也会继续执行)支持回滚(rollback)
并发控制提供 WATCH 实现乐观锁提供行锁、表锁等机制

五、总结

问题回答
Redis 有事务吗?,通过 MULTIEXECDISCARDWATCH 等命令实现。
Redis 事务是原子性的吗?命令是一个接一个顺序执行的,具有一定隔离性,但不支持回滚,某些命令失败不会影响后续命令执行。
Redis 支持回滚吗?不支持传统意义上的回滚,如果某个命令出错,其他命令依旧会执行。
如何实现并发控制?使用 WATCH 命令实现乐观锁,检测 key 是否被其他客户端修改。

如果你需要更严格的 ACID 事务(比如银行转账场景),Redis 可能不是最合适的工具,可以考虑使用 关系型数据库(如 MySQL、PostgreSQL) 或者结合 Redis 与 Lua 脚本(Lua 脚本在 Redis 中是原子执行的)。


🔧 补充:Lua 脚本也是 Redis 提供的一种“原子操作”方式,常用于复杂事务逻辑的实现,且性能很高。

http://www.dtcms.com/a/570362.html

相关文章:

  • 《计算机操作系统》_并发控制:同步(条件变量、信号量、生产者消费者、哲学家吃饭问题)20251104
  • 外贸网站优化免费渠道北京网页设计公司有哪些
  • 怎样凡科建设网站定制手机号码官方网站
  • 广西柳州网站建设郑州展厅设计制作公司
  • 电子商务网站建设经费网站的方案
  • 网站被攻击了怎么办?如何进行DDoS防御?
  • 肯达建设网站用什么做网站最好
  • 网站建设交流论坛地址茂名网站制作推广
  • 个人网站的设计与开发免费静态网页
  • 链表节点复用
  • 【经典书籍】《人月神话》第十三章“金牌团队与银牌团队”精华讲解
  • ThreadPoolExecutor 的七个参数
  • 为进一步加强校园网站建设wordpress 页面 固定链接
  • C 命令行参数
  • 做网站都需要什么工具网站备案 营业执照副本
  • springboot测试临时数据修改指南
  • 从零到一:Kubernetes 基础概念与集群部署详解
  • 如何优化SQL查询性能?测试与开发协同优化指南
  • 衡水安徽网站建设网站建设需要注意什么 知乎
  • 手机怎么制作网站教程视频犀牛云做网站怎么样
  • 苏州建设网站wordpress页面编辑插件
  • 学习Java第五十九天——MySQL篇
  • 公司网站搭建费用用上网做任务的网站
  • 甘肃省城乡与建设厅网站首页关键词是在网站后台做的吗
  • 营销印刷网站wordpress模板网站标题重复
  • 室内空间设计网站推荐开网店需要什么准备
  • 烟台城乡建设学校网站开发公司支付前期物业开办费包括哪些内容
  • 【仓颉纪元】仓颉三方库适配深度实战:7 天打通 SQLite 生态壁垒
  • 电源完整性07-如何确定PDN网络中的大电容
  • Java - 使用虹软人脸识别sdk记录