MongoDB数据库中的ABA问题

CAS:对于内存中的某一个值V,提供一个旧值A和一个新值B。如果提供的旧值V和A相等就把B写入V。这个过程是原子性的。CAS执行结果要么成功要么失败,对于失败的情形下一般采用不断重试。或者放弃。
ABA:如果另一个线程修改V值假设原来是A,先修改成B,再修改回成A。当前线程的CAS操作无法分辨当前V值是否发生过变化。

MongoDB数据库多用户环境下,许多应用在同时处理数据。
例如:
db.media.updateOne({"Tracklist.Title":"Been a son"},{$inc:{"Tracklist.$.Track":1}})
由于我们此时使用"Tracklist.Title":"Been a son"作为唯一标识符,假设Tracklist.Track的值为0,X用户和Y用户同时通过不同应用希望增量操作,X用户将Track值增量为1,而此时Tracklist.Title依旧是"Been a son",所以当B用户同时操作时,会认为原来的数据0就是他此时操作的数据,因此将Track值修改为1,但其实我们希望的是,结果值是2,可以想象成投票。
目前想到策略是:
1.将X用户和Y用户的操作放到队列中去,依次执行
2.设置一个版本变量,使得每次更新数据后,都增加它的值
MongoDB提供了一种原子方式修改和返回文档的方法:
db.media.findAndModify({"Title":"Been a son",sort:{"Title":-1},remove:true})

相关文章

文章浏览阅读552次。com.mongodb.MongoQueryException: Quer...
文章浏览阅读635次,点赞9次,收藏8次。MongoDB 是一种 NoSQ...
文章浏览阅读2.1k次。和。_mongodb 日期类型
文章浏览阅读1.7k次。Scalestack等客户期待使用MongoDB Atla...
文章浏览阅读970次。SpringBoot整合中间件mongodb、ES_sprin...
文章浏览阅读673次。MongoDB 简介_尚医通sql