數據庫——事務、保存點、批量更新


事務(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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM