redis 事务 执行3个命令,第二个报错了,第三个还会执行吗?
1 个回答
纵然前路迷茫,纵然天隔一方,纵然我手中的刀刃已然破碎,也无法阻挡我寻找你的道路。龙舞在 Redis 事务中,如果执行了三个命令,第二个命令报错,那么 **第三个命令是否会执行** 取决于 **错误类型**: ### 1. **语法错误(事务入队阶段出错)** - 如果错误是在 `MULTI` 之后的 **入队阶段**(即 `QUEUED` 之前)发生的,例如拼写错误、参数错误,那么整个事务都不会执行。 - 例如: ```redis MULTI SET key1 value1 WRONG_COMMAND key2 value2 # 这里有错误 SET key3 value3 EXEC ``` 由于 `WRONG_COMMAND` 是一个不存在的命令,在 `EXEC` 执行前就会报错,导致 `EXEC` 失败,整个事务 **不会执行**。 ### 2. **运行时错误(事务执行阶段出错)** - 如果错误发生在 `EXEC` 之后(即事务正在执行),那么 **Redis 不会回滚已执行的命令**,但会继续执行后续命令。 - 例如: ```redis MULTI SET key1 value1 INCR key1 # key1 是字符串,INCR 只能用于数字,报错 SET key3 value3 EXEC ``` 事务执行时: - `SET key1 value1` **成功** - `INCR key1` **失败**(因为 `key1` 不是整数) - `SET key3 value3` **仍然会执行** - 也就是说,**第二个命令失败,但第三个命令仍然执行**。 ### 3. **WATCH 机制影响** - 如果 `WATCH` 监视的键在 `EXEC` 之前发生了变化,`EXEC` 直接失败,事务不会执行任何命令。 ### **总结** - **语法错误**(入队时报错)→ `EXEC` 不执行,整个事务失败。 - **运行时错误**(执行时报错)→ 事务不回滚,后续命令 **仍会执行**。 - **WATCH 触发** → `EXEC` 失败,事务不会执行。 如果你需要**保证事务的原子性**(要么全部执行,要么全部不执行),可以使用 **LUA 脚本** 或 **其他方式** 来实现。发布于 2025-03-14 01:48 •IP属地 内蒙古举报评论收藏
公众号进入网站体验更佳

