名将擂台:添加事务
This commit is contained in:
+28
-17
@@ -93,25 +93,36 @@ export default class LadderMatch extends BaseModel {
|
|||||||
return defense;
|
return defense;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async changeRank(isSuccess: boolean, attackInfo: LadderOppPlayerInfo, defenseInfo: LadderOppPlayerInfo) {
|
public static async changeRank(isSuccess: boolean, attackInfo: LadderOppPlayerInfo, defenseInfo: LadderOppPlayerInfo, times = 0) {
|
||||||
// TODO transaction
|
if(times > 10) return { isChange: false }
|
||||||
let atkLadderMatch: LadderMatchType, defLadderMatch: LadderMatchType, isChange = false;
|
const session = await mongoose.connection.startSession();
|
||||||
if(defenseInfo.isRobot) {
|
session.startTransaction()
|
||||||
atkLadderMatch = await LadderMatchModel.findOne({ roleId: attackInfo.roleId }).lean();
|
|
||||||
if(isSuccess && atkLadderMatch && atkLadderMatch.rank > defenseInfo.oldRank) {
|
try {
|
||||||
atkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkLadderMatch.rank } }, { new: true }).lean();
|
|
||||||
isChange = true;
|
let atkLadderMatch: LadderMatchType, defLadderMatch: LadderMatchType, isChange = false;
|
||||||
}
|
if(defenseInfo.isRobot) {
|
||||||
} else {
|
atkLadderMatch = await LadderMatchModel.findOne({ roleId: attackInfo.roleId }).lean();
|
||||||
atkLadderMatch = await LadderMatchModel.findOne({ roleId: attackInfo.roleId }).lean();
|
if(isSuccess && atkLadderMatch && atkLadderMatch.rank > defenseInfo.oldRank) {
|
||||||
defLadderMatch = await LadderMatchModel.findOne({ roleId: defenseInfo.roleId }).lean();
|
atkLadderMatch = await LadderMatchModel.findOneAndUpdate({ roleId: attackInfo.roleId }, { $set: { rank: defenseInfo.oldRank, oldRank: atkLadderMatch.rank } }, { new: true }).lean();
|
||||||
if(isSuccess && atkLadderMatch && defLadderMatch && atkLadderMatch.rank > defLadderMatch.rank) {
|
isChange = true;
|
||||||
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();
|
} else {
|
||||||
isChange = true;
|
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 }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user