MongoDB数据库中的ABA问题

前端之家收集整理的这篇文章主要介绍了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})

猜你在找的MongoDB相关文章