Mongodb MongoError:无法获取锁

Mongodb MongoError:无法获取锁,mongodb,mongoose,mongodb-atlas,Mongodb,Mongoose,Mongodb Atlas,我最近在运行测试时遇到了这个错误。我在本地MongoDB服务器(4.0.5)上试过,也在MongoAtlas上试过,但遇到了同样的问题 我尝试增加锁超时,但没有效果 我不确定是什么问题 { MongoError: Unable to acquire lock '{8576955153473224393: Database, 1659426125832142537}' within a max lock request timeout of '5ms' milliseconds. at q

我最近在运行测试时遇到了这个错误。我在本地MongoDB服务器(4.0.5)上试过,也在MongoAtlas上试过,但遇到了同样的问题

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

我不确定是什么问题

{ 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)]: {} }

了解您正在使用的导致超时的查询,以及您有哪些索引,以及工作负载有多重,这将是非常有益的。可以使用以下命令增加超时时间:

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

但我会首先尝试运行一个分析器,看看是什么导致了争用:


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

可以通过将
maxTransactionLockRequestTimeoutMillis
设置为更高的值来防止
无法获取锁
错误,但由于我也有此错误
由于挂起的集合目录更改而无法从快照读取;请重试该操作。
同时,我想出了以下方法来修复该错误,这反过来也修复了第一个错误:


My test runner(AVA)为每个测试文件创建一个新的数据库,但现在似乎需要一些时间来解决,并在
mongoose.connect之后添加
wait timeout(1000)
。问题消失了。对此解决方案不太满意,但对其进行测试已经足够好了。

谢谢,我将尝试探查器,可能还有mongodb调试标志,看看是哪个查询导致了这种情况。我已经尝试过增加超时时间,但没有效果。将超时时间增加到500毫秒对我来说很有效;我在本地使用(mongod 4.0.13)进行单元测试,默认设置下测试不稳定。