MongoError:无法获取锁

Posted

技术标签:

【中文标题】MongoError:无法获取锁【英文标题】:MongoError: Unable to acquire lock 【发布时间】:2019-06-17 00:54:18 【问题描述】:

我最近在运行测试时遇到了这个错误。我在本地 MongoDB 服务器 (4.0.5) 上进行了尝试,并且在 Mongo Atlas 上进行了尝试,但遇到了同样的问题。

我尝试增加锁定超时,但没有效果。

我不确定是什么问题。

 MongoError: Unable to acquire lock '8576955153473224393: Database, 1659426125832142537' within a max lock request timeout of '5ms' milliseconds.
    at queryCallback (/home/user/workspace/my-project/node_modules/mongodb-core/lib/cursor.js:248:25)
    at /home/user/workspace/my-project/node_modules/mongodb-core/lib/connection/pool.js:532:18
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)
  errorLabels: [ 'TransientTransactionError' ],
  operationTime: Timestamp  _bsontype: 'Timestamp', low_: 29, high_: 1548245676 ,
  ok: 0,
  errmsg: 'Unable to acquire lock \'8576955153473224393: Database, 1659426125832142537\' within a max lock request timeout of \'5ms\' milliseconds.',
  code: 24,
  codeName: 'LockTimeout',
  '$clusterTime': 
    clusterTime: Timestamp  _bsontype: 'Timestamp', low_: 29, high_: 1548245676 ,
     signature:  hash: [Object], keyId: 0  ,
  name: 'MongoError',
  [Symbol(mongoErrorContextSymbol)]:  

【问题讨论】:

【参考方案1】:

不是真正的修复,而是一种解决方法。因为它只在自动化测试期间发生在我的本地机器上,而在生产中不会发生,所以我可以侥幸逃脱。

Unable to acquire lock 错误可以通过将maxTransactionLockRequestTimeoutMillis 设置为更高的值来防止,但由于我同时也有此错误Unable to read from a snapshot due to pending collection catalog changes; please retry the operation.,我想出了以下方法来修复该错误,这反过来也修复了第一个错误:

我的测试运行程序 (AVA) 为每个测试文件创建一个新数据库,但现在似乎需要一些时间来解决并在 mongoose.connect 问题消失后添加 await timeout(1000)。对这个解决方案不太满意,但对于测试来说已经足够了。

【讨论】:

【参考方案2】:

了解您正在使用的导致超时的查询以及您有哪些索引以及工作量有多大会很有帮助。您可以使用以下命令增加超时时间:

db.adminCommand( setParameter: 1, maxTransactionLockRequestTimeoutMillis: 5000 )

但我会先尝试运行分析器以查看导致争用的原因:

https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/

【讨论】:

谢谢,我会尝试分析器,也许还有 mongodb 调试标志,看看是哪个查询导致了这种情况。我已经尝试增加超时,但没有效果。 将超时时间增加到 500 毫秒对我有用;我在本地使用npmjs.com/package/run-rs(mongod 4.0.13)进行单元测试,默认设置下测试不稳定。

以上是关于MongoError:无法获取锁的主要内容,如果未能解决你的问题,请参考以下文章

MongoError:无法从缺少的 BSON 类型转换为日期

MongoError:无法在本地运行项目

MongoError:在 mongoDB atlas 中首次连接时无法连接服务

MongoError:在 mongoDB atlas 中首次连接时无法连接服务

MongoError:无法推断要设置的查询字段,路径“用户”匹配两次

无法连接到 mongolab,出现 MongoError: auth failed