MongoDB中的原子性和CAS操作

gku*_*min 2 mongodb

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

  1. 某些文档中存在某些文档,其_id值设置为123,并且属性cas_val设置为10.
  2. 第一个客户端想要更新cas_val文档,_id等于123到11.
  3. 第二个客户端想要更新cas_val文档,_id等于123到11.
  4. 两个客户端同时运行,操作可以交错.

那么,如果没有对123 文档进行其他更新,那么这两个操作是否可能成功_id

PS mongodb乐观锁定场景中是否有一些内置技术?

Asy*_*sky 10

乐观锁定的正确技术是使用MongoDB文档中详细描述的"当前更新" .

这种技术的关键在于更新条件不能简单{_id:123},而是必须,{_id:123, cas_val: 10}并且update子句将设置适当的字段,包括将cas_val增加到11.

现在,"失去"比赛并且第二次到达的线程将找不到要更新的匹配文档,并且需要通过重新获取文档(现在使用cas_val 11)并再次尝试来"重试".您了解更新是否成功的方法是检查writeConcern结构(它将指示在"n"中受影响的记录数以及现有记录是否已在"updatedExisting"字段中更新).