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
解释:
MULTI:表示开始一个事务。- 接下来输入的所有命令(如
SET,INCR等)会被放入队列中,但不会立即执行。 EXEC:执行队列中的所有命令。这些命令会按照顺序执行,且在执行期间不会被其他客户端的命令打断。- 如果使用了
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 有事务吗? | 有,通过 MULTI、EXEC、DISCARD、WATCH 等命令实现。 |
| Redis 事务是原子性的吗? | 命令是一个接一个顺序执行的,具有一定隔离性,但不支持回滚,某些命令失败不会影响后续命令执行。 |
| Redis 支持回滚吗? | 不支持传统意义上的回滚,如果某个命令出错,其他命令依旧会执行。 |
| 如何实现并发控制? | 使用 WATCH 命令实现乐观锁,检测 key 是否被其他客户端修改。 |
如果你需要更严格的 ACID 事务(比如银行转账场景),Redis 可能不是最合适的工具,可以考虑使用 关系型数据库(如 MySQL、PostgreSQL) 或者结合 Redis 与 Lua 脚本(Lua 脚本在 Redis 中是原子执行的)。
🔧 补充:Lua 脚本也是 Redis 提供的一种“原子操作”方式,常用于复杂事务逻辑的实现,且性能很高。

