Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 尝试使用mongo事务时获取WriteConflict(v4.0.12)_Mongodb_Scala_Reactivemongo - Fatal编程技术网

Mongodb 尝试使用mongo事务时获取WriteConflict(v4.0.12)

Mongodb 尝试使用mongo事务时获取WriteConflict(v4.0.12),mongodb,scala,reactivemongo,Mongodb,Scala,Reactivemongo,我的交易非常简单,如下所示: def updateReportTransac(metadata: Metadata, expensesIds: List[String], pairings: List[Pairing])(implicit ec: ExecutionContext): Future[Report] = for { dbWithSession <- collection.db.startSession() dbWithTx <- dbWithSess

我的交易非常简单,如下所示:

  def updateReportTransac(metadata: Metadata, expensesIds: List[String], pairings: List[Pairing])(implicit ec: ExecutionContext): Future[Report] = for {
    dbWithSession <- collection.db.startSession()
    dbWithTx <- dbWithSession.startTransaction(None)
    reportCollection = dbWithTx.collection[BSONCollection](collection.name) 

    _ <- firstUpdate(reportCollection, metadata, expensesIds)
    rep <- secondUpdate(reportCollection, metadata, pairings)

    _ <- dbWithTx.commitTransaction()

    _ <- dbWithSession.endSession()
  } yield rep

  def firstUpdate(collection: BSONCollection, metadata: Metadata, expensesIds: List[String]): Future[UpdateWriteResult] = {
    collection.update.one(
      q = BSONDocument(
        "metadata.companyId" -> metadata.companyId,
        "metadata.reportId" -> metadata.reportId,
        "metadata.workloadId" -> metadata.workloadId),
      u = BSONDocument("$set" -> BSONDocument("expenses.$[elem].paired" -> true)),
      upsert = false, multi = false, collation = None,
      arrayFilters = Seq(BSONDocument("elem.id" -> BSONDocument("$in" -> expensesIds)))
    )
  }

  def secondUpdate(collection: BSONCollection, reportMetadata: Metadata, pairings: List[Pairing]): Future[Report] = {
    collection.findAndUpdate(
      selector = BSONDocument(
        "metadata.companyId" -> metadata.companyId,
        "metadata.reportId" -> metadata.reportId,
        "metadata.workloadId" -> metadata.workloadId),
      update = BSONDocument("$addToSet" -> BSONDocument("pairings" -> BSONDocument("$each" -> pairings))),
      fetchNewObject = true, upsert = false, sort = None, fields = None, bypassDocumentValidation = false, writeConcern = WriteConcern.Acknowledged, maxTime = None, collation = None, arrayFilters = Nil)
      .map(_.result[Report].getOrElse {
        throw new NoSuchElementException
      })
  }

指示版本将是useful@cchantepmongodb v4.0.12,reactivemongo 0.18.8-play27(我知道有更新的版本,但目前无法更改),然后由于新版本中有修复程序。。。另外,请查看和@cchantep,以便如果我无法移动到更高版本,您建议不要使用transaction?如果您对同一数据执行并发读写,您应该使用withTransaction api,它有助于编写适当的代码来处理写冲突。指示版本将是useful@cchantepmongodb v4.0.12,reactivemongo 0.18.8-play27(我知道有更新的版本,但目前无法更改),然后由于新版本中有修复程序。。。另外,请查看和@cchantep,如果我无法移动到更高版本,您建议不要使用transaction?如果您对同一数据执行并发读取和写入,您应该使用withTransaction api,它可以帮助编写适当的代码来处理写入冲突。
 error: CommandError[code=112, errmsg=WriteConflict, doc: {
  "errorLabels": [
    "TransientTransactionError"
  ],
  "operationTime": Timestamp(1595840406, 194),
  "ok": 0.0,
  "errmsg": "WriteConflict",
  "code": 112,
  "codeName": "WriteConflict",
  "$clusterTime": {
    "clusterTime": Timestamp(1595840406, 194),
    "signature": {
      "hash": BSONBinary(GenericBinarySubtype, size = 20),
      "keyId": NumberLong(6805543085452296193)
    }
  }
}]