1

我想用 mongo 或 couch db 获取独占锁。

  1. 可能吗?(API 参考会有所帮助)
  2. 当客户端突然死亡时,是否有可能释放独占锁?
4

1 回答 1

2

关于 MongoDB:

Mongo 不支持开箱即用,并且在并发方面非常有限。要简要了解支持和不支持的内容,请参阅mogo 并发常见问题解答。这对我来说非常有用。

但你总是可以假装它。使用对象创建一个集合来管理您的独占锁。然后使用findAndModify将 isLocked 字段设置为 true。不要忘记添加查询选项以查找 isLocked = false 的对象。如果返回一个对象,则表示您拥有锁,否则该对象已被锁定。

db.lockCollection.findAndModify( {
   query: { isLocked: false },
   update: { $set: { isLocked: true } },
   upsert: true
} );

为避免由于故障导致无限锁定,您可以创建一个TTL 索引,该索引将在任意时间段后删除文档。该方法的主要缺点是它是一种自定义方法,因此它可能存在错误,并且锁实际上在您的应用程序端,而不是在 db 端,因此任何其他代码都可以做任何事情。

希望能帮助到你!

于 2014-02-23T22:21:31.563 回答