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);
}
BatchUpdateException 獲取失敗詳情。逐條執行,記錄成功/失敗計數,最後業務層決策是否重試或告警。