MongoError: Unable to acquire lock

MongoError: Unable to acquire lock

我最近在 运行 我的测试中遇到了这个错误。我在本地 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)]: {} }

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

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

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

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

不是真正的修复,而是解决方法。由于它只在自动测试期间发生在我的本地机器上,而在生产中不会发生,所以我可以摆脱这个。

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) 问题消失了。对这个解决方案不是很满意,但对于测试来说已经足够了。