node.js - Mongodb Error withTransaction:给定的事务编号 1 与任何正在进行的事务不匹配。活跃事务数为-1
问题描述
Mongoose 文档说在使用事务时使用withTransaction以获得最佳实践,因为它将处理所有这些
- 创建交易
- 如果成功则提交事务
- 如果您的操作抛出,则中止事务
- 在发生临时事务错误时重试。
但是withTransaction函数进行无限重试。它抛出的错误如下。从错误 #1 中可以看出,它重试了 1998 次并继续重试。
我的代码有问题吗?有人可以指出我正确的方向吗?
设置: MongoDB 服务器 4.4.x:猫鼬 ^5.10.0
代码:
try {
const session = await db.startSession();
await session.withTransaction(() => {
console.log('transaction in progress')
return new Promise((resolve, reject) => {
Promise.all([
Model1().bulkWrite([...], { session }),
Model2().bulkWrite([...], { session })
])
.then(resp => {
console.log('bulk write resolved successfully')
resolve(resp)
})
.catch(error => {
console.log('transaction error', error)
reject(error)
})
})
})
} catch (error) {
console.error('withTransaction: ', error)
throw error
} finally {
session.endSession()
}
错误 #1:
transaction in progress
transaction error MongoError: Given transaction number 1998 does not match any in-progress transactions. The active transaction number is 1997
at MessageStream.messageHandler (/var/task/node_modules/mongodb/lib/cmap/connection.js:299:20)
at MessageStream.emit (events.js:400:28)
at processIncomingData (/var/task/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
at MessageStream._write (/var/task/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
at writeOrBuffer (internal/streams/writable.js:358:12)
at MessageStream.Writable.write (internal/streams/writable.js:303:10)
at TLSSocket.ondata (internal/streams/readable.js:726:22)
at TLSSocket.emit (events.js:400:28)
at addChunk (internal/streams/readable.js:290:12)
at readableAddChunk (internal/streams/readable.js:265:9)
at TLSSocket.Readable.push (internal/streams/readable.js:204:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:188:23) {
operationTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1634234124 },
ok: 0,
code: 251,
codeName: 'NoSuchTransaction',
'$clusterTime': {
clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1634234124 },
signature: { hash: [Binary], keyId: [Long] }
},
[Symbol(errorLabels)]: Set(1) { 'TransientTransactionError' }
}
错误 #2:
transaction in progress
transaction error MongoError: WriteConflict error: this operation conflicted with another operation. Please retry your operation or multi-document transaction.
at MessageStream.messageHandler (/var/task/node_modules/mongodb/lib/cmap/connection.js:299:20)
at MessageStream.emit (events.js:400:28)
at processIncomingData (/var/task/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
at MessageStream._write (/var/task/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
at writeOrBuffer (internal/streams/writable.js:358:12)
at MessageStream.Writable.write (internal/streams/writable.js:303:10)
at TLSSocket.ondata (internal/streams/readable.js:726:22)
at TLSSocket.emit (events.js:400:28)
at addChunk (internal/streams/readable.js:290:12)
at readableAddChunk (internal/streams/readable.js:265:9)
at TLSSocket.Readable.push (internal/streams/readable.js:204:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:188:23) {
operationTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1634234124 },
ok: 0,
code: 112,
codeName: 'WriteConflict',
'$clusterTime': {
clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1634234124 },
signature: { hash: [Binary], keyId: [Long] }
},
[Symbol(errorLabels)]: Set(1) { 'TransientTransactionError' }
}
解决方案
推荐阅读
- python - Scrapy in Python order extract with xpaths
- python - ValueError: math domain error whilst using inverse sine rule
- javascript - Vue: How to build bundle for Nuxt with vue-cli-service?
- jupyter-notebook - shell command # can't be carry out when it not used for comments on colab
- office-js - Officejs loaded out side of Excel when putting TaskPane in iframe
- angular - Angular:试图让 ngx-pagination 工作
- r - 如何平均图函数并找到R中的置信带
- c# - Docker:使用 docker 和 netcore3.1 将文件写入物理或共享路径
- c++ - 为什么我不能从文本文件创建矢量对象?
- html - 在 if 块内部时,在单词 Jinja 之间的空格后强制换行