ExecuteCommandHasChangeAsync 结果不准 返回

SqlSugar 沟通中
1 552

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 fate sta VIP0
    2025/11/27

    这个是受影响行数,也就where命中多少条返回多少条。

    0 回复