在使用Lua脚本时,我注意到的一件事是,在包含多个操作的脚本中,如果在脚本执行过程中抛出错误,则在错误之前完成的操作实际上会反映在数据库中。这与MULTI / EXEC相反,后者所有操作都成功或失败。
例如,如果我有如下脚本:
redis.call("hset", "mykey", "myfield", "val") local expiry = someFunctionThatMightThrow() redis.call("expire", "mykey", expiry)
我对此进行了测试,并且第一次hset调用的结果反映在redis中。是否有任何方法可以使lua脚本起作用,以便在脚本执行过程中引发任何错误,然后恢复该脚本执行过程中执行的所有操作?
hset
我上面的评论的示例脚本,关于错误手动回滚。注意:语法未经验证。
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