繁体   English   中英

RethinkDB中的原子条件更新

[英]Atomic conditional update in RethinkDB

RethinkDB 在某些条件下为我们提供了一些原子性保证 我正在尝试通过使用修订字段来利用它来实现开放式并发(c#)。 这样的想法是,如果在客户端编辑自己的修订时修改了数据,则更新将失败。 应该插入新条目。

var id = "some unique id";
var rev = "the old known revision";
var doc = new {id, Revision = Guid.NewGuid().ToString("N")};
var result = await R.Db("test").Table("table")
    .Get(id)
    .Replace(found => 
        R.Branch(
            found.Eq(null), doc,
            found["Revision"].Eq(rev), doc,
            found
        )
    ).RunResultAsync(connection);

上面的代码似乎可以达到这个目的,但是我想知道它是否确实消除了严格并发访问的竞争条件。 换句话说,此更新/插入或向上插入是原子的吗? 如果可能的话,请引导我阅读一些文档。

该文档谈到了一个检查设置寄存器 (也可能是CAS,比较和交换),我认为它对解释哪些操作实际上是原子操作以及我们如何保证它(例如使用集成)没有帮助。测试)。

我的印象是,如果满足以下条件:

  • write_acks:多数
  • 耐久性:坚硬
  • read_mode:多数

并且,如果写入不涉及辅助查询或其他文档,则该写入是原子的。 如果我喜欢的话,那里有太多的信仰。 我希望如果有一个标志或某些操作必须是原子的,否则就取消它。 好吧,直到那时,我能相信我的印象吗? SO上也存在混乱

您的示例查询是原子的。 它是原子的,因为它使用Replace修改单个文档。 如果它修改了多个文档,则整个查询将不是原子的,但是对每个文档的修改将是单独的原子操作。

有一个标志ReplacenonAtomic ,默认为true。 除非你通过nonAtomic参数Replace ,传递给函数的Replace将被原子进行。

没有整个查询的atomic或非nonAtomic标志。

当您尝试以原子方式执行非确定性操作时,RethinkDB将引发错误:

无法证明论点是确定的。 也许您想使用non_atomic标志?

您链接到文档提到:

要通过单个原子操作读取和修改文档,请使用update或replace命令。

检查并设置寄存器只是可以原子执行的操作的示例。 它还可以说明原子操作的警告:只有传递给ReplaceUpdate的函数是原子的。 周围的查询不是,例如FilterGetAll

RethinkDB操作从不跨多个键进行原子操作

阅读您链接到讨论 ,这种困惑似乎源于文档中的错误。 曾经说

如果 用户运行 无法原子执行 的查询, 则默认情况下RethinkDB将引发错误。

但纠正说

如果无法自动执行更新或替换查询 ,则默认情况下,RethinkDB将引发错误

另请参阅原子性模型如何工作?

每个文档均支持写入原子性–保证对单个JSON文档的更新是原子性的。 RethinkDB与其他NoSQL系统的不同之处在于,原子文档更新不仅限于一小部分可能的操作- 可以对单个文档执行的任何操作组合都可以保证原子更新文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM