【发布时间】:2017-06-08 15:54:14
【问题描述】:
RethinkDB 给了我们一些atomicity guarantees under certain conditions。我正在尝试使用修订字段来利用它来实现乐观并发(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);
上面的代码似乎可用于此目的,但我想知道它是否确实会消除紧密并发访问的竞争条件。换句话说,这个更新/插入或更新插入是原子的吗?如果可能,请指导我查阅一些文档。
文档提到了一个 check-and-set register(它也可能是 CAS,比较和交换),我认为它对于解释哪些操作实际上是原子的和我们如何保证它(例如使用集成测试)。
我的印象是,如果满足以下条件:
- write_acks:多数
- 耐用性:硬
- read_mode:多数
如果写入不涉及辅助查询或其他文档,则写入是原子的。那些ifs,我喜欢那里有太多的信心。如果有标志或操作必须是原子的,我更愿意,否则核对它。在那之前,我能相信我的印象吗? 还有confusion on SO。
【问题讨论】:
标签: c# concurrency rethinkdb upsert atomic