|
|
@@ -246,7 +246,7 @@ class LsyMerchantServiceTest {
|
|
|
* <p>这**不是理论情形**:真库里 {@code mch_no='Y52211090004'} 就有 <b>2</b> 行,
|
|
|
* 同租户、{@code enterprise_id} 一行有值一行 NULL,**两行各自都合法**
|
|
|
* (分别落在 {@code uk_lsy_merchant_tenant_ent} 与 {@code uk_lsy_merchant_tenant_level} 上)。
|
|
|
- * 唯一索引 {@code uk_lsy_merchant_mch_no} 今天不存在、且因这两行**建不起来**,
|
|
|
+ * 唯一索引 {@code uk_lsy_merchant_mch_no} 2026-09-23 时不存在、且因这两行**建不起来**,
|
|
|
* 删哪一行是用户的数据决策 ⇒ 这个状态可能长期存在。
|
|
|
*
|
|
|
* <p>所以:0 行 ⇒ 404;>1 行 ⇒ **抛**(且 ERROR 日志里带命中的 id,那是人工处置的唯一线索)。
|
|
|
@@ -548,7 +548,7 @@ class LsyMerchantServiceTest {
|
|
|
// · save 的编辑分支写不了 review_status,返回值又与正常成功无法区分。
|
|
|
//
|
|
|
// 【为什么必须是 selectList 而不是 selectOne / LIMIT 1】
|
|
|
- // pay_lsy_merchant 在 mch_no 上**今天没有唯一索引** —— 2026-09-23 实测真库里有重复
|
|
|
+ // pay_lsy_merchant 在 mch_no 上**2026-09-23 时没有唯一索引** —— 该日实测真库里有重复
|
|
|
// (mch_no='Y52211090004' 两行,且两行都合法:一行 enterprise_id 有值、一行 NULL)。
|
|
|
// 未认证查询不带租户谓词,`LIMIT 1` 会**静默取任意一行**,而那一行可能是别的租户的。
|
|
|
// ⇒ 安全来自**查询形状**,不来自唯一性(唯一性是第二道闸,见 db/lsy-merchant-mch-no-uk.sql)。
|
|
|
@@ -602,7 +602,7 @@ class LsyMerchantServiceTest {
|
|
|
* WHERE 指向**定位到那一行的 id**,而不是 {@code mch_no}。
|
|
|
*
|
|
|
* <p>用 {@code id} 的理由不是审美:定位与写入之间若有人插进一行同 {@code mch_no} 的行,
|
|
|
- * {@code WHERE mch_no = ?} 会**一次改两行**(而唯一索引今天还不存在,插得进来)。
|
|
|
+ * {@code WHERE mch_no = ?} 会**一次改两行**(而唯一索引 2026-09-23 时还不存在,插得进来)。
|
|
|
* 主键定位没有这个窗口。
|
|
|
*/
|
|
|
@Test
|
|
|
@@ -644,7 +644,7 @@ class LsyMerchantServiceTest {
|
|
|
/**
|
|
|
* 多行 ⇒ {@code AMBIGUOUS},且**一行都不写**。
|
|
|
*
|
|
|
- * <p>这是本写入口存在的**主要理由**:{@code mch_no} 今天真的重复(真库实测 2 行),
|
|
|
+ * <p>这是本写入口存在的**主要理由**:{@code mch_no} 2026-09-23 时真的重复(真库实测 2 行),
|
|
|
* 而这条路径免登录、查询不带租户谓词 —— 随便挑一行的后果是**写到别的租户头上**。
|
|
|
*/
|
|
|
@Test
|
|
|
@@ -704,8 +704,8 @@ class LsyMerchantServiceTest {
|
|
|
* ★ {@code update} 返回 <b>0</b> ⇒ {@code NOT_FOUND},且<b>不抛</b>。
|
|
|
*
|
|
|
* <p>可达窗口只有「定位到写入之间那一行没了」(并发删除 / 主键换了)。正因为窗口窄,
|
|
|
- * 它此前<b>零覆盖</b>:全 diff 里 {@code merchantMapper.update} 的桩只有三处
|
|
|
- * {@code thenReturn(1)}、{@code thenReturn(0)} 一处都没有 ⇒ 删掉这段处理全量照样绿。
|
|
|
+ * 它此前<b>零覆盖</b>:加这段处理之前,{@code merchantMapper.update} 返回 0 的桩全文件只有一处,
|
|
|
+ * 且属于 {@code save} 那条路径的用例({@code save_updateBranch_zeroAffectedRows_throws404})⇒ 删掉这段处理全量照样绿。
|
|
|
* 而它是这条路径上唯一把「DB 说一行都没改到」翻译成「怎么应答上游」的地方。
|
|
|
*
|
|
|
* <p>为什么不抛:调用方要的是一个结果去决定怎么应答上游,而这种情况的正确答案与
|