问题描述
如果在Box.begin()... Box.commit()块内发生错误,则Tarantool Box会阻止操作,直到您手动执行Box.commit()
例如,我提供的数据不正确,而我的功能中没有任何字段:
replace = function(space,data)
local id = data[1][1]
Box.begin()
my_module.delete(space,id)
local response = my_module.insert(space,data)
Box.commit()
return response
end
在my_module.insert()内部,它将遇到一个错误,因此将在执行Box.commit()之前中止执行replace()。
稍后,如果我再次用另一个数据调用replace(),则由于先前打开的事务,它将无法执行Box.begin()。
pcall(my_module.insert())无法捕获错误。
解决方法
有一个方便的功能-box.atomic
我建议执行以下操作:
replace = function(space,data)
return box.atomic(function()
local id = data[1][1]
my_module.delete(space,id)
return my_module.insert(space,data)
end)
end
pcall(my_module.insert())无法捕获错误。
pcall
捕获所有错误。未发现该错误,可能是因为它发生在删除操作的早期。
顺便说一句,Tarantool具有内联替换操作:
https://www.tarantool.io/en/doc/latest/reference/reference_lua/box_space_index/#box-space-replace