Tarantool块进行操作,如果box.begin... box.commit块内发生错误

问题描述

如果在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