首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

批量 SQL 執行結果判斷策略:事務控制與受影響行數統計的最佳實踐

     編輯:程式設計疑難解答

單條 vs 多條

  • 單條:executeUpdate() 返回受影響行數,=1 通常視為成功。
  • 多條:需區分「全部成功」與「部分成功」業務語義。

推薦方案:事務 + 批量執行

Connection conn = null;
try {
    conn = dataSource.getConnection();
    conn.setAutoCommit(false); // 開啟事務

    String sql = "UPDATE account SET balance = balance - ? WHERE id = ?";
    try (PreparedStatement ps = conn.prepareStatement(sql)) {
        for (Transfer t : transfers) {
            ps.setBigDecimal(1, t.getAmount());
            ps.setLong(2, t.getFromId());
            ps.addBatch();
            ps.setBigDecimal(1, t.getAmount());
            ps.setLong(2, t.getToId());
            ps.addBatch();
        }
        int[] results = ps.executeBatch(); // 返回每條影響行數數組
        // 檢查 results 每項是否為 1
        for (int r : results) {
            if (r != 1) throw new RuntimeException("更新失敗");
        }
    }
    conn.commit(); // 全部成功提交
} catch (Exception e) {
    if (conn != null) conn.rollback(); // 任一失敗回滾
    throw e;
} finally {
    if (conn != null) conn.setAutoCommit(true);
}

關鍵點

  1. 事務保證原子性:要么全成功,要么全回滾,避免數據不一致。
  2. executeBatch() 返回 int[]:每個元素對應一條 SQL 的影響行數,可精確判斷每條結果。
  3. 錯誤處理:捕獲 BatchUpdateException 獲取失敗詳情。

無事務場景(如異步日志)

逐條執行,記錄成功/失敗計數,最後業務層決策是否重試或告警。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved