ExecuteCommandHasChangeAsync 结果不准 返回
老菜鸟了 发布于2025/11/27
ExecuteCommandHasChangeAsync 这个方法的结果 不能用于重要业务的判定吧?
以下都是 AI 回答的:
⚠️ 但 MySQL 的「受影响行数」有 两种模式!
这是根本原因!
📌 模式 1:默认行为(CLIENT_FOUND_ROWS 未启用)
只有当字段值真正发生变化时,才算“受影响”
如果新值 == 旧值 → AffectedRows = 0
📌 模式 2:启用 CLIENT_FOUND_ROWS 标志
返回的是 “匹配到的行数”,不管值是否变化
🧨 更隐蔽的问题:并发下的“幻读”或“条件失效”
即使没有 +0,也可能出现:
事务 A 读库存:quantity=100, blocked=50
事务 B 同时占用 30 → blocked=80
事务 A 执行:UPDATE ... SET blocked = 50 + 40 WHERE quantity >= 50 + 40
→ 条件 100 >= 90 成立,匹配 1 行
但更新后:blocked = 80 + 40 = 120 > quantity=100 → 超卖!
但注意:这个例子中 AffectedRows = 1,你以为成功了,其实数据错了!
所以:仅靠 AffectedRows 无法保证业务正确性,必须配合 强一致性校验。
已用 乐观锁解决
热忱回答(1)
-
fate sta VIP0
2025/11/27这个是受影响行数,也就where命中多少条返回多少条。
0 回复