[英]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,比较和交换),我认为它对解释哪些操作实际上是原子操作以及我们如何保证它(例如使用集成)没有帮助。测试)。
我的印象是,如果满足以下条件:
并且,如果写入不涉及辅助查询或其他文档,则该写入是原子的。 如果我喜欢的话,那里有太多的信仰。 我希望如果有一个标志或某些操作必须是原子的,否则就取消它。 好吧,直到那时,我能相信我的印象吗? SO上也存在混乱 。
您的示例查询是原子的。 它是原子的,因为它使用Replace
修改单个文档。 如果它修改了多个文档,则整个查询将不是原子的,但是对每个文档的修改将是单独的原子操作。
有一个标志Replace
, nonAtomic
,默认为true。 除非你通过nonAtomic
参数Replace
,传递给函数的Replace
将被原子进行。
没有整个查询的atomic
或非nonAtomic
标志。
当您尝试以原子方式执行非确定性操作时,RethinkDB将引发错误:
无法证明论点是确定的。 也许您想使用non_atomic标志?
要通过单个原子操作读取和修改文档,请使用update或replace命令。
检查并设置寄存器只是可以原子执行的操作的示例。 它还可以说明原子操作的警告:只有传递给Replace
或Update
的函数是原子的。 周围的查询不是,例如Filter
或GetAll
。
RethinkDB操作从不跨多个键进行原子操作
阅读您链接到的讨论 ,这种困惑似乎源于文档中的错误。 曾经说
如果
用户运行无法原子执行的查询,则默认情况下RethinkDB将引发错误。
但纠正说
如果无法自动执行更新或替换查询 ,则默认情况下,RethinkDB将引发错误
另请参阅原子性模型如何工作?
每个文档均支持写入原子性–保证对单个JSON文档的更新是原子性的。 RethinkDB与其他NoSQL系统的不同之处在于,原子文档更新不仅限于一小部分可能的操作- 可以对单个文档执行的任何操作组合都可以保证原子更新文档 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.