From 4d81de52d7793452e8c65452d472a09bd3d26d8f Mon Sep 17 00:00:00 2001 From: luying Date: Sat, 16 Jul 2022 20:04:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8D=E5=B0=86=E6=93=82=E5=8F=B0=EF=BC=9A?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=8B=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/db/LadderMatch.ts | 45 +++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/shared/db/LadderMatch.ts b/shared/db/LadderMatch.ts index 0972a92bc..79a6d8a38 100644 --- a/shared/db/LadderMatch.ts +++ b/shared/db/LadderMatch.ts @@ -93,25 +93,36 @@ export default class LadderMatch extends BaseModel { return defense; } - public static async changeRank(isSuccess: boolean, attackInfo: LadderOppPlayerInfo, defenseInfo: LadderOppPlayerInfo) { - // TODO transaction - let atkLadderMatch: LadderMatchType, defLadderMatch: LadderMatchType, isChange = false; - if(defenseInfo.isRobot) { - atkLadderMatch = await LadderMatchModel.findOne({ roleId: attackInfo.roleId }).lean(); - if(isSuccess && atkLadderMatch && atkLadderMatch.rank > defenseInfo.oldRank) { - atkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkLadderMatch.rank } }, { new: true }).lean(); - isChange = true; - } - } else { - atkLadderMatch = await LadderMatchModel.findOne({ roleId: attackInfo.roleId }).lean(); - defLadderMatch = await LadderMatchModel.findOne({ roleId: defenseInfo.roleId }).lean(); - if(isSuccess && atkLadderMatch && defLadderMatch && atkLadderMatch.rank > defLadderMatch.rank) { - atkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defLadderMatch.rank, oldRank: atkLadderMatch.rank } }, { new: true }).lean(); - defLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: defenseInfo.roleId }, { $set: { rank: atkLadderMatch.rank, oldRank: defLadderMatch.rank } }, { new: true }).lean(); - isChange = true; + public static async changeRank(isSuccess: boolean, attackInfo: LadderOppPlayerInfo, defenseInfo: LadderOppPlayerInfo, times = 0) { + if(times > 10) return { isChange: false } + const session = await mongoose.connection.startSession(); + session.startTransaction() + + try { + + let atkLadderMatch: LadderMatchType, defLadderMatch: LadderMatchType, isChange = false; + if(defenseInfo.isRobot) { + atkLadderMatch = await LadderMatchModel.findOne({ roleId: attackInfo.roleId }).lean(); + if(isSuccess && atkLadderMatch && atkLadderMatch.rank > defenseInfo.oldRank) { + atkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkLadderMatch.rank } }, { new: true }).lean(); + isChange = true; + } + } else { + atkLadderMatch = await LadderMatchModel.findOne({ roleId: attackInfo.roleId }).lean(); + defLadderMatch = await LadderMatchModel.findOne({ roleId: defenseInfo.roleId }).lean(); + if(isSuccess && atkLadderMatch && defLadderMatch && atkLadderMatch.rank > defLadderMatch.rank) { + atkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defLadderMatch.rank, oldRank: atkLadderMatch.rank } }, { new: true }).lean(); + defLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: defenseInfo.roleId }, { $set: { rank: atkLadderMatch.rank, oldRank: defLadderMatch.rank } }, { new: true }).lean(); + isChange = true; + } } + await session.commitTransaction() + return { isChange, atkLadderMatch, defLadderMatch } + } catch(e) { + return await this.changeRank(isSuccess, attackInfo, defenseInfo, times + 1); + } finally { + session.endSession() } - return { isChange, atkLadderMatch, defLadderMatch } } }