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