事務(transaction)
當所有語句都順利執行后,事務可以被提交(commit)。若某個語句遇到錯誤,那么事務將被回滾。
將多個命令組合成事務的原因是為了確保數據庫完整性(database integrity)。
默認情況下,數據庫連接處於自動提交模式,一旦SQL命令被執行便被提交給數據庫。一旦命令被提交,就無法對它進行回滾操作。
使用事務時,需關閉自動提交模式 conn.setAutoCommit(false);
創建一個語句對象 Statement stat = conn.createStatement();
然后任意多次地調用executeUpdate方法 stat.executeUpdate(command1);
stat.executeUpdate(command2);
執行了所有命令后,調用commit方法提交 conn.commit();
如果出現錯誤,調用rollback()回滾 conn.rollback();
保存點
使用保存點,可以在回滾操作時只回滾到該保存點即可,而非事務的開頭。
Statement stat = conn.createStatement();//開始事務,rollback()回退到事務開頭
stat.executeUpdate(command1);
Savepoint svpt = conn.setSavepoint();//設置保存點,rollback(svpt)回退到該點
stat.executeUpdate(command2);
...
conn.commit();
conn.releaseSavepoint(svpt);//當不需要保存點時,必須要釋放
批量更新
一個命令序列作為一批操作同時被收集和提交。
處於同一批中的容器可以是INSERT、UPDATE和DELETE等操作,也可以是數據庫定義命令,如CREATE TABLE和DROP TABLE。但是,在批量處理中添加SELECT命令會拋異常。
批量處理首先需創建Statement對象
Statement stat = conn.createStatement();
然后調用addBatch方法:
String command = "CREATE TABLE ...";
stat.addBatch(command);
while(...){
command = "INSERT INTO ... VALUES(...)";
stat.addBatch(command);
}
提交整個批量更新語句
int[] counts = stat.executeBatch();//返回一個記錄數的數組
為了在批量模式下正確的處理錯誤,必須將批量執行的操作視為單個事務。如果批量更新失敗,必須回滾到批量操作開始之前的狀態。
首先,關閉自動提交模式,然后收集批量操作,執行並提交該操作,最后恢復最初自動提交模式:
boolean autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
Statement stat = conn.getStatement();
...
//keep calling stat.addBatch(...);
...
stat.executeBatch();
conn.commit();
conn.setAutoCommit(autoCommit);