Chr*_*aks 5 mongoose mongodb mongodb-atlas
我最近在运行测试时遇到了这个错误。我在本地 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)]: {} }
Run Code Online (Sandbox Code Playgroud)
并不是真正的修复,而是一种解决方法。由于它只在自动化测试期间发生在我的本地计算机上,并且在生产中不会发生,所以我可以摆脱这种情况。
Unable to acquire lock可以通过将 设定maxTransactionLockRequestTimeoutMillis为更高的值来防止该错误,但由于我Unable to read from a snapshot due to pending collection catalog changes; please retry the operation.同时也遇到了此错误,因此我想出了以下方法来修复该错误,这又修复了第一个错误:
我的测试运行程序(AVA)为每个测试文件创建一个新数据库,但似乎现在需要一些时间来解决并在问题消失await timeout(1000)后添加。mongoose.connect对此解决方案不太满意,但对于测试来说它已经足够好了。
小智 6
了解您正在使用的导致超时的查询以及您拥有哪些索引以及工作负载有多大将很有帮助。您可以使用以下命令增加超时:
db.adminCommand( { setParameter: 1, maxTransactionLockRequestTimeoutMillis: 5000 })
但我会首先尝试运行分析器来查看导致争用的原因:
https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/
| 归档时间: |
|
| 查看次数: |
17288 次 |
| 最近记录: |