From 0bbb52284cc5f50320121873b0c423254035f7d5 Mon Sep 17 00:00:00 2001 From: hailin Date: Wed, 14 Jan 2026 01:02:08 -0800 Subject: [PATCH] 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 --- .claude/settings.local.json | 3 ++- .../application/services/bonus-claim.service.ts | 14 +++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 202929fd..6772c963 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -769,7 +769,8 @@ "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(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": [], "ask": [] diff --git a/backend/services/contribution-service/src/application/services/bonus-claim.service.ts b/backend/services/contribution-service/src/application/services/bonus-claim.service.ts index 42009670..856f536e 100644 --- a/backend/services/contribution-service/src/application/services/bonus-claim.service.ts +++ b/backend/services/contribution-service/src/application/services/bonus-claim.service.ts @@ -60,12 +60,20 @@ export class BonusClaimService { `(directReferralAdoptedCount: ${previousCount} -> ${newCount})`, ); - // 在事务中处理补发 - await this.unitOfWork.executeInTransaction(async () => { + // 检查是否已在事务中(被 ContributionCalculationService 调用时) + // 如果已在事务中,直接执行,避免嵌套事务导致超时 + if (this.unitOfWork.isInTransaction()) { for (const tier of tiersToClaimList) { await this.claimBonusTier(accountSequence, tier); } - }); + } else { + // 独立调用时,开启新事务 + await this.unitOfWork.executeInTransaction(async () => { + for (const tier of tiersToClaimList) { + await this.claimBonusTier(accountSequence, tier); + } + }); + } } /**