Tarantool 在 box.begin()...box.commit() 块内发生错误会阻塞操作

如果 box.begin()...box.commit() 块内发生错误,Tarantool 将阻塞操作直到您手动执行 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()) 无法捕获错误。

点赞
用户3722288
用户3722288

有一个很方便的函数 - 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

2020-10-25 09:30:32