Redis Lua脚本未向Java客户端返回值时,事务是否会回滚?
Redis Lua脚本执行失败时,操作是否会回滚?
核心结论
你的预期是对的:如果Lua脚本因执行错误未能返回newAmount,脚本中执行的HINCRBYFLOAT操作会被完全撤销,相当于事务回滚的效果。
详细解释
- Redis Lua脚本是原子性执行的:Redis会将整个脚本作为一个不可分割的操作单元处理,执行期间不会插入其他客户端的命令。
- 脚本执行出错时的行为:如果脚本在执行
redis.call("HINCRBYFLOAT", ...)时抛出异常(比如key不是哈希类型、amount不是合法浮点数、参数数量不对等),Redis会立即终止脚本执行,并且撤销脚本中已经执行的所有Redis命令——也就是你这行HINCRBYFLOAT的修改不会生效。 - 关于返回值的说明:脚本未能返回
newAmount的场景,本质上是脚本执行过程中触发了错误(否则脚本会正常走到return newAmount步骤)。这种情况下,Redis会向Java客户端返回错误信息,同时不会保留任何脚本执行产生的修改。
额外注意
如果是Lua语法错误(比如变量名写错、括号不匹配),这类脚本根本无法被Redis加载执行,自然不会产生任何数据修改。
内容的提问来源于stack exchange,提问作者Md. Saiful Islam
相关产品推荐
相关产品推荐

