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数据库中的ABA问题全部内容,希望文章能够帮你解决MongoDB数据库中的ABA问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)