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

Optimistic locking 在Tarantool中是否有方法在执行更新之前检查元组的状态(乐观锁检查/CAS模式)?,optimistic-locking,tarantool,Optimistic Locking,Tarantool,我试图找到有关在Tarantool DB中实现乐观锁的方法的信息。 这个案例并没有包含在文档中,所以我无法找到采取这种行动的可能方式 我的目标是找到一种方法来解决来自多个客户端(应用程序服务器)的相同元组的并发更新的潜在数据冲突。 对于这样的负载,在读取元组和更新元组之间总是有延迟,所以存在竞争条件的空间。我试图避免分布式系统中的悲观锁——对于这种锁,我们需要额外的组件——任何新组件的添加都必须考虑到许多因素。如果我正确理解您的问题,我可以建议您遵循以下模式 向元组中添加新字段“version”

我试图找到有关在Tarantool DB中实现乐观锁的方法的信息。 这个案例并没有包含在文档中,所以我无法找到采取这种行动的可能方式

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

如果我正确理解您的问题,我可以建议您遵循以下模式

向元组中添加新字段“version”或“timestamp”。 并在执行更新操作之前进行检查

例如: 我有一个模式{id,value,version}和初始元组{1,0,0}

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

假设您有第二个请求,它使用操作{{{'+',value',2}}更新同一个元组,然后再次使用“仅当版本==0时”更新该元组。 您试图保存它,但当您得到id=1的tuple时,您会得到{1,1,1}。
这并不是仅当_version==0时才满足_条件(因为当前元组版本为1)。在这种情况下,您将错误返回给用户。

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

函数更新\u cas(键、元组、版本)
本地旧=空格:get(键)
如果old.version~=version,则错误('Oops!')结束
元组[版本\字段\编号]=版本+1
空格:替换(元组)
结束

我希望它能给你一个想法。

你对乐观锁算法的详细描述基本上是正确的-我的问题是,在tarantool部分中,“仅当版本==0”从你的描述中是如何实现的。谢谢!正如我从文档中所看到的,这种方法对于内存引擎来说很好,没有异步操作,所以整个过程运行时没有中断。如果磁盘引擎出现相同的问题,是否会有漏洞?是的,您应该将其包装在box.begin/box.commit中,以确保这样的更改是事务性的