目前我正在尝试了解如何在mongodb中正确实现CAS操作以支持乐观锁定。我发现mongodb
中的更新是原子的,但我不确定这意味着什么(只有文档重写是原子的还是所有更新周期,包括搜索相应的文档及其重写,都是原子的?)。让我们考虑以下示例。
_id
值设置为123,属性cas_val
设置为10。cas_val
,_id
等于123到11。cas_val
,_id
等于123到11. 那么,如果没有对_id
123的文档进行其他更新,两个操作是否可能成功?
P.S。对于乐观锁定场景,mongodb
中是否有一些内置技术?
答案 0 :(得分:10)
乐观锁定的正确技巧是使用详细描述in MongoDB docs的“当前更新”。
这种技术的关键是更新条件不能简单地为{_id:123}
,而是必须为{_id:123, cas_val: 10}
,而update子句将设置适当的字段,包括将cas_val增加到11。
现在,“失去”比赛并且第二次到达的线程将找不到要更新的匹配文档,并且需要通过重新获取文档(现在使用cas_val 11)并再次尝试来“重试”。您了解更新是否成功的方法是检查writeConcern结构(它将指示“n”中受影响的记录数以及现有记录是否已在“updatedExisting”字段中更新。)
答案 1 :(得分:1)
如果您使用正确的运算符进行原子更新,则无需获取文档然后更新它,因此更新将不会交错(至少数据集仍将保持一致)。看来你想要$inc
operator BTW。