Redis 的确支持“事务”(通过 MULTI / EXEC)
Redis 的确支持“事务”(通过 MULTI / EXEC),但它的事务机制与传统数据库(如 MySQL)的事务机制有明显的不同。我们来详细讲清楚:
✅ Redis 的事务机制本质上是“命令打包 + 顺序执行”
Redis 的事务,是 Redis 自己内部实现的一种原子性批量命令执行机制,但它 不具备传统数据库事务的“回滚(rollback)”功能!
🔧 Redis 事务使用方式:
MULTI
SET a 1
SET b 2
INCR c
EXEC
这段事务的含义是:
-
从 MULTI 开始,Redis 不会立即执行命令,而是把它们加入事务队列
-
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 保证命令的原子性顺序执行。
但与传统数据库事务不同,它 不支持回滚和持久锁机制,也不支持事务中途失败时撤销已执行的命令。
它更像是一种“命令打包执行器”,适用于轻量一致性场景。
浙公网安备 33010602011771号