Redis如何使EVAL脚本的行为与MULTI / EXEC相似?

我注意到在Lua脚本中进行多个操作时,如果在脚本执行过程中抛出错误,那么在错误之前已经完成的操作实际上会在数据库中反映出来。这与MULTI / EXEC不同,后者要么全部操作成功,要么全部操作失败。

例如,假如我有如下所示的脚本:

redis.call("hset", "mykey", "myfield", "val")
local expiry = someFunctionThatMightThrow()
redis.call("expire", "mykey", expiry)

我对其进行了测试,发现第一个hset调用的结果反映在了Redis中。是否有办法让Lua脚本表现得像MULTI / EXEC一样,即如果在脚本执行期间抛出任何错误,则撤消脚本执行期间执行的所有操作?

点赞
用户1261267
用户1261267

以下是我上面评论中的示例脚本,错误时需要手动回滚。注意:语法未经验证。

redis.call("hset", "mykey", "myfield", "val")
local expiry,error = pcall(someFunctionThatMightThrow())
if expiry ~= nil then
  redis.call("expire", "mykey", expiry)
else
  redis.call("hdel", "mykey", "myfield")
end
2020-05-10 19:56:03