fix(contribution): avoid nested transaction timeout in BonusClaimService

Use unitOfWork.isInTransaction() to detect if already in a transaction
context (called from ContributionCalculationService). If so, reuse the
existing transaction instead of opening a new one, preventing Prisma
interactive transaction timeout errors.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-14 01:02:08 -08:00
parent 7588d18fff
commit 0bbb52284c
2 changed files with 13 additions and 4 deletions

View File

@ -769,7 +769,8 @@
"Bash(git rm:*)", "Bash(git rm:*)",
"Bash(echo \"请在服务器运行以下命令检查 outbox 事件:\n\ndocker exec -it rwa-postgres psql -U rwa_user -d rwa_contribution -c \"\"\nSELECT id, event_type, aggregate_id, \n payload->>''sourceType'' as source_type,\n payload->>''accountSequence'' as account_seq,\n payload->>''sourceAccountSequence'' as source_account_seq,\n payload->>''bonusTier'' as bonus_tier\nFROM outbox_events \nWHERE payload->>''accountSequence'' = ''D25122900007''\nORDER BY id;\n\"\"\")", "Bash(echo \"请在服务器运行以下命令检查 outbox 事件:\n\ndocker exec -it rwa-postgres psql -U rwa_user -d rwa_contribution -c \"\"\nSELECT id, event_type, aggregate_id, \n payload->>''sourceType'' as source_type,\n payload->>''accountSequence'' as account_seq,\n payload->>''sourceAccountSequence'' as source_account_seq,\n payload->>''bonusTier'' as bonus_tier\nFROM outbox_events \nWHERE payload->>''accountSequence'' = ''D25122900007''\nORDER BY id;\n\"\"\")",
"Bash(ssh -o ConnectTimeout=10 ceshi@14.215.128.96 'find /home/ceshi/rwadurian/frontend/mining-admin-web -name \"\"*.tsx\"\" -o -name \"\"*.ts\"\" | xargs grep -l \"\"用户管理\\\\|users\"\" 2>/dev/null | head -10')", "Bash(ssh -o ConnectTimeout=10 ceshi@14.215.128.96 'find /home/ceshi/rwadurian/frontend/mining-admin-web -name \"\"*.tsx\"\" -o -name \"\"*.ts\"\" | xargs grep -l \"\"用户管理\\\\|users\"\" 2>/dev/null | head -10')",
"Bash(dir /s /b \"c:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\")" "Bash(dir /s /b \"c:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\")",
"Bash(dir /b \"c:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\services\")"
], ],
"deny": [], "deny": [],
"ask": [] "ask": []

View File

@ -60,13 +60,21 @@ export class BonusClaimService {
`(directReferralAdoptedCount: ${previousCount} -> ${newCount})`, `(directReferralAdoptedCount: ${previousCount} -> ${newCount})`,
); );
// 在事务中处理补发 // 检查是否已在事务中(被 ContributionCalculationService 调用时)
// 如果已在事务中,直接执行,避免嵌套事务导致超时
if (this.unitOfWork.isInTransaction()) {
for (const tier of tiersToClaimList) {
await this.claimBonusTier(accountSequence, tier);
}
} else {
// 独立调用时,开启新事务
await this.unitOfWork.executeInTransaction(async () => { await this.unitOfWork.executeInTransaction(async () => {
for (const tier of tiersToClaimList) { for (const tier of tiersToClaimList) {
await this.claimBonusTier(accountSequence, tier); await this.claimBonusTier(accountSequence, tier);
} }
}); });
} }
}
/** /**
* *