首页 > 解决方案 > Mongodb Error withTransaction:给定的事务编号 1 与任何正在进行的事务不匹配。活跃事务数为-1

问题描述

Mongoose 文档说在使用事务时使用withTransaction以获得最佳实践,因为它将处理所有这些

  1. 创建交易
  2. 如果成功则提交事务
  3. 如果您的操作抛出,则中止事务
  4. 在发生临时事务错误时重试。

但是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' }
}

标签: node.jsmongodbmongoosetransactions

解决方案


推荐阅读