rwadurian/backend
hailin be7ec87f05 feat(wallet): 增强认种流程可靠性 - 添加事务保护和乐观锁
## 问题背景

认种流程(冻结→确认扣款→解冻)存在以下可靠性问题:
1. 余额检查与冻结操作非原子性,存在并发竞态条件
2. 钱包更新与流水记录分开执行,可能导致数据不一致
3. 缺少乐观锁机制,并发修改时可能出现余额错误
4. Kafka consumer 错误被吞掉,消费失败无法重试

## 修复内容

### wallet-application.service.ts

1. **freezeForPlanting (冻结资金)**
   - 添加 `prisma.$transaction` 事务保护
   - 添加乐观锁 (version 字段检查)
   - 添加重试机制 (最多 3 次,指数退避)
   - 幂等性检查移入事务内,避免竞态

2. **confirmPlantingDeduction (确认扣款)**
   - 添加事务保护,确保扣款与流水原子性
   - 添加乐观锁防止并发修改
   - 添加重试机制

3. **unfreezeForPlanting (解冻资金)**
   - 添加事务保护,确保解冻与流水原子性
   - 添加乐观锁防止并发修改
   - 添加重试机制

### planting-event-consumer.service.ts

- 添加 `throw error` 重新抛出错误
- 确保消费失败时 Kafka 能感知并触发重试

## 乐观锁实现

```typescript
const updateResult = await tx.walletAccount.updateMany({
  where: {
    id: walletRecord.id,
    version: currentVersion,  // 版本检查
  },
  data: {
    usdtAvailable: newAvailable,
    version: currentVersion + 1,  // 版本递增
  },
});

if (updateResult.count === 0) {
  throw new OptimisticLockError('版本冲突');
}
```

## 测试验证

- wallet-service 构建成功
- 服务重启正常,所有 handler 注册成功

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 19:56:49 -08:00
..
.claude refactor: simplify mpc-service to gateway mode 2025-12-06 17:16:14 -08:00
api-gateway fix(gateway): remove duplicate /leaderboard route from referral-service 2025-12-09 22:00:22 -08:00
infrastructure feat(sentry): 集成 Sentry 自建崩溃收集与错误追踪系统 2025-12-15 07:15:13 -08:00
mpc-system feat(wallet/mpc): 增强提现和充值流程可靠性 2025-12-15 19:47:20 -08:00
scripts fix(scripts): 修正容器名为 rwa-blockchain-service 2025-12-15 10:34:25 -08:00
services feat(wallet): 增强认种流程可靠性 - 添加事务保护和乐观锁 2025-12-15 19:56:49 -08:00
.env.windows fix(referral): 修复 getMyReferralInfo 使用 userId 而不是 accountSequence 的问题 2025-12-14 05:05:03 -08:00
docker-compose.windows.yml fix(referral): 修复 getMyReferralInfo 使用 userId 而不是 accountSequence 的问题 2025-12-14 05:05:03 -08:00