MongoDB中的原子性和CAS操作

时间:2013-05-13 13:43:04

标签: mongodb

目前我正在尝试了解如何在mongodb中正确实现CAS操作以支持乐观锁定。我发现mongodb中的更新是原子的,但我不确定这意味着什么(只有文档重写是原子的还是所有更新周期,包括搜索相应的文档及其重写,都是原子的?)。让我们考虑以下示例。

  1. 某些文档中存在某些文档,_id值设置为123,属性cas_val设置为10。
  2. 第一个客户希望更新文档cas_val_id等于123到11。
  3. 第二个客户希望更新文档cas_val_id等于123到11.
  4. 两个客户端同时运行,操作可以交错。
  5. 那么,如果没有对_id 123的文档进行其他更新,两个操作是否可能成功?

    P.S。对于乐观锁定场景,mongodb中是否有一些内置技术?

2 个答案:

答案 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。