我就是奇迹

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Redis 的确支持“事务”(通过 MULTI / EXEC)

Redis 的确支持“事务”(通过 MULTI / EXEC),但它的事务机制与传统数据库(如 MySQL)的事务机制有明显的不同。我们来详细讲清楚:

 


 

 

✅ Redis 的事务机制本质上是“命令打包 + 顺序执行”

 

 

Redis 的事务,是 Redis 自己内部实现的一种原子性批量命令执行机制,但它 不具备传统数据库事务的“回滚(rollback)”功能!

 


 

 

🔧 Redis 事务使用方式:

 

MULTI
SET a 1
SET b 2
INCR c
EXEC

这段事务的含义是:

 

  1. MULTI 开始,Redis 不会立即执行命令,而是把它们加入事务队列

  2. EXEC 一下,按顺序批量执行所有命令

 

 


 

 

✅ Redis 事务有哪些特性?

 

特性

是否支持

说明

原子性执行所有命令

EXEC 后所有命令按顺序执行,不会被打断

执行中止回滚

如果某个命令出错,Redis 不回滚之前的命令

并发隔离性

Redis 是单线程,事务期间不会被其他命令插入干扰

一致性

部分支持

命令语法有效才会执行,但语义错误不会中止事务

 

 


 

 

⚠️ 举个“不能回滚”的例子:

 

MULTI
SET user Tom
INCR user     # 错误!user 是字符串,不能自增
SET age 30
EXEC

结果是:

 

  • SET user Tom ✔ 执行成功

  • INCR user ❌ 报错,但不会阻止后续执行

  • SET age 30 ✔ 仍然执行

 

 

👉 所以 Redis 的事务中,一条命令失败,不会回滚前面的命令!

 


 

 

✅ 与传统数据库事务的对比:

 

特性

Redis 事务

MySQL 等数据库事务

开始事务

MULTI

BEGIN or START TRANSACTION

提交事务

EXEC

COMMIT

回滚事务

❌ 不支持

✅ 支持 ROLLBACK

原子性

✅ 执行队列是原子性的

✅ 执行是原子性的

隔离性

✅(单线程操作)

✅(支持多种隔离级别)

持久性

配合 AOF 持久化才实现

✅ 默认持久化

 

 


 

 

✅ Redis 提供的事务相关指令

 

命令

说明

MULTI

开启事务,进入事务队列模式

EXEC

提交事务,执行所有队列中的命令

DISCARD

放弃事务队列,清空未提交命令

WATCH key

监听某些 key 是否被改动,实现乐观锁

UNWATCH

取消 WATCH

 

 


 

 

🧠 Bonus:WATCH 实现简单的乐观锁(加分)

 

WATCH balance
MULTI
DECR balance
INCR purchases
EXEC

如果执行过程中有别的客户端修改了 balance,EXEC 会返回 null,表示事务被取消(不是回滚,是压根不执行)

 


 

 

✅ 总结一句话(面试金句):

 

 

Redis 支持轻量级事务,通过 MULTI/EXEC 保证命令的原子性顺序执行。
但与传统数据库事务不同,它 不支持回滚和持久锁机制,也不支持事务中途失败时撤销已执行的命令
它更像是一种“命令打包执行器”,适用于轻量一致性场景。

 

posted on 2025-04-21 15:27  我就是奇迹  阅读(48)  评论(0)    收藏  举报