Redis如何使EVAL脚本表现得像MULTI/EXEC



我在玩Lua脚本时注意到的一件事是,在包含多个操作的脚本中,如果在执行脚本的中途抛出错误,那么在错误之前完成的操作实际上会反映在数据库中。这与MULTI/EXEC形成对比,MULTI/EXEC中所有操作要么成功,要么失败。

例如,如果我有一个如下的脚本:

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

我对此进行了测试,第一次hset调用的结果反映在redis中。有没有什么方法可以让lua脚本正常运行,这样,如果在脚本执行过程中抛出任何错误,那么在脚本执行期间执行的所有操作都会被恢复?

我上面评论的示例脚本,关于手动回滚的错误。注意:语法未经验证。

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

最新更新