# Plan — Round 2 Performance Evaluation (2026-05-26)

> Agent: council/PerformanceBenchmarker

## Phase: Draft → Review → Finalize

---

## 评估任务清单

- [x] **Task 1**: [Done: PerformanceBenchmarker] 检查 git log 和文件结构
- [x] **Task 2**: [Done: PerformanceBenchmarker] 探索 SeatMapService + seatmap API + SKIP LOCKED 实现
- [x] **Task 3**: [Done: PerformanceBenchmarker] 输出 Round 1 性能评估报告
- [x] **Task 4**: [Done: PerformanceBenchmarker] Round 2：代码实测验证 + 交叉审查其他成员报告
- [x] **Task 5**: [Pending] 等待西莉雅汇总最终报告

---

## 阶段划分

| 阶段 | 内容 | 状态 |
|------|------|------|
| **Draft** | Task 1-3（独立评估 Round 1） | ✅ 完成 |
| **Review** | Task 4（代码实测 + 交叉审查） | ✅ 完成 |
| **Finalize** | 西莉雅汇总所有成员报告 | ⏳ 等待西莉雅 |

---

## 依赖关系

- 本轮评估无对其他成员的依赖，可独立完成
- 最终综合报告由西莉雅（协调者）负责

---

## 投票结果

**议题：下一步主攻方向**
- 投票：**C（双线并行）**（Round 1 + Round 2 一致）

详见 `docs/council-eval-performancebenchmark.md`

---

## 关键发现摘要（Round 2 修正版）

| # | 严重程度 | 问题 | 量化 |
|---|----------|------|------|
| P1-R2 | 🔴 严重 | seatmap API 全量扫描无缓存过滤 | 500 并发 = 2.5 GB/s |
| P2-R2 | 🟡 高 | `SeatSkuService::getSoldSeats()` 方法缺失（与 BackendArchitect P0-1 双重确认） | soldSeats stub |
| P3-R2 | 🟡 高 | 无细粒度差量轮询 API，所有用户全量拉取 | 500 并发 = 2500 DB SELECT/s |
| P4-R2 | 🟡 高 | inventory > 0 vs =0 两套逻辑不一致 | 状态不一致窗口 |
| P5-R2 | 🟢 中 | verifyTicket() 无 SKIP LOCKED | 低频，优化非必须 |
| P6-R2 | 🟢 中 | onOrderPaid 无事务包装 | P2（SecurityEngineer 已评） |

**超卖归因修正（Round 2 关键）**：
- ShopXO `dec()` 原子条件 UPDATE = 主要防线，不需要 FOR UPDATE SKIP LOCKED
- issueTicket() TOCTOU = P1-suggestion（唯一索引修复），非 P0
- verifyTicket() = 已有 `lock(true)`，SKIP LOCKED 是优化非必须

---

## 优先级建议（基于修正后 P 表）

1. **P0**：添加 `(goods_id, inventory, id)` 复合索引 → 消除全量扫描
2. **P0**：`SeatSkuService::getSoldSeats()` 实现 → 解锁 soldSeats API
3. **P1**：新增 `GET /seatmap/delta` 差量轮询 API → 降低 80% 带宽和 DB QPS
4. **P1**：加唯一索引 `(order_id, seat_info)`（SecurityEngineer 建议）
5. **P2**：Phase 4 Tree API 实现
