|
|
@@ -109,12 +109,19 @@ func returnsResultSet(op Op) bool {
|
|
|
// 不读结果集的话:`Exec` 会留下未消费的结果集,且 `success=0`(LEAVE 分支)看不出来。
|
|
|
case OpUseActivityRecommend:
|
|
|
return true
|
|
|
- // `sp_user_divide_into_update_quota` **不在此列**(= 不读结果集)。
|
|
|
- // 它的正文末尾确实有一句 `SELECT userid FROM t_user_divide_into WHERE …`,
|
|
|
- // 但**不是 `success/msg` 契约**,且用户在不存在时那句的 `WHERE left_val>=NULL` 恒 NULL ⇒ 空集。
|
|
|
- // 按"正文末尾有没有 SELECT"这条判据(见本函数抬头)它**该算有** ——
|
|
|
- // 所以这里把差异显式写出来:本枚举落地时先按 `false` 调,**等 DV-7 实测 CALL 行为后再定**。
|
|
|
- // ⚠ 若实测发现 `Exec` 会留下未消费结果集,就把本枚举挪到上面的 `return true` 组里。
|
|
|
+ // SP 分账调额:正文末尾 `SELECT userid FROM t_user_divide_into WHERE …` **确实产出一个结果集**。
|
|
|
+ //
|
|
|
+ // 判据不是"它需要这个结果集",而是"**它确实产出一个结果集,我们必须消费掉**"。
|
|
|
+ // 走 `Exec` 的后果(比"多读几行"贵得多):
|
|
|
+ // 连接上留下**未消费的结果集** ⇒ 同连接下一次查询报
|
|
|
+ // `Error 2014: Commands out of sync; you can't run this command now`,
|
|
|
+ // 而且**报在下一条语句上** —— 看起来像"DV-7 的快照读坏了"。
|
|
|
+ // dual-run 每个 case 只开 5 个句柄(`MaxOpenConns=1`),一个未消费结果集能把后半段打死。
|
|
|
+ //
|
|
|
+ // ⚠ 那句 `SELECT` **不是 `success/msg` 契约**(它是祖先链,用户不存在时恒空):
|
|
|
+ // 只用来 **drain** —— 不要按 `success=0` 判它,也不要把它的行数当断言依据。
|
|
|
+ case OpDivideQuotaClamp:
|
|
|
+ return true
|
|
|
}
|
|
|
return false
|
|
|
}
|