Tarantool 中有没有办法在执行更新之前检查元组的状态(乐观锁检查/CAS 模式)?

Is there a way in Tarantool to check state of tuple before performing update (optimistic lock check / CAS pattern)?

我试图查找有关在 Tarantool DB 中实现乐观锁的方法的信息。 这种情况未包含在文档中,因此我无法找到执行此类操作的可能方法。

我的目标是找到一种方法来解决来自多个客户端(应用程序服务器)的相同元组并发更新的潜在数据冲突。 对于这样的负载,读取元组和更新元组之间总是存在滞后——因此存在竞争条件的空间。我尽量避免分布式系统中的悲观锁——对于这种锁定,我们需要额外的组件——并且任何新组件的添加都必须考虑很多因素。

如果我正确理解了您的问题,我可以建议您遵循以下架构。

向您的元组添加新字段“版本”或“时间戳”。 并在执行更新操作之前检查它。

示例: 我有一个架构 {id, value, version} 和初始元组 {1, 0, 0}。

第一个查询请求获取元组{1, 1, 0}并尝试执行更新操作{{'+', 'value', 1}} 并且“仅当版本== 0”。 然后你去存储保存结果。在保存之前,您获取原始元组并检查版本是否等于“0”,然后保存元组。现在您已经更新了元组 {1, 1, 1}。

假设您有第二个请求绑定到更新同一个元组的操作 {{'+', 'value', 2}} 并再次使用“仅当版本 == 0”。 您尝试保存它,但是当您获得 id=1 的元组时,您将获得 {1, 1, 1}。 这不满足 only_if_version == 0 条件(因为当前元组版本为 1)。在这种情况下,你 return 错误给你的用户。

这将是一个类似于以下的存储过程(代码已简化):

function update_cas(key, tuple, version)
   local old = space:get(key)
   if old.version ~= version then error('Oops!') end
   tuple[VERSION_FIELD_NUMBER] = version + 1
   space:replace(tuple)
end

我希望它能给你灵感。