我在玩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