mongo里怎么实现读锁

在sql数据库里,SELECT ... FOR UPDATE为记录主动加锁。

在mongo里面要达到类似的效果可以这样做:

var doc = db.foo.findOneAndUpdate({ _id: 1 },    
      { $set: { myLock: { appName: "myApp", pseudoRandom: ObjectId() } } })

解释:

  • myLock是专门为实现锁定义的与业务逻辑无关的字段,就像乐观锁里的version。
  • pseudoRandom: ObjectId()是为了达到唯一随机效果,引起更新,这样才能获得锁。
  • 因为在mongodb里如果写入的值与原来的值一样的话,实际上是优化了,没有任何改变,也就不会获得锁。

参见

How To SELECT … FOR UPDATE inside MongoDB Transactions


Total views.

© 2013 - 2019. All rights reserved.

Powered by Hydejack v6.6.1