1. 程式人生 > >JDBC 事務的回滾 提交

JDBC 事務的回滾 提交


JDBC中,採用事務首先需要設定connection.setAutoCommit(false);JDBC事務開啟的第一步,如果不設定,connection會自動提交事物.

rollback 和 commit的作用都完成對資料庫的一次操作.並且釋放當前的一些資源.
對於commit之後的事務,是不能夠再進行回滾,但是對於回滾之後的失誤,在不同的情況下卻可以選擇提交.

rollback()和rollback(Savepoint)的區別也就在於次.
這兩方面方法會丟擲SQLException,如果該事務為自動提交.即:
connection.setAutoCommint(true),或者是預設設定.

參看以下程式碼:


private String sql = "insert into t_transaction_test (name,value)  values(?,?)";


        pstm = conn.prepareStatement(sql);
        
        pstm.setString(1, "test9");
        pstm.setString(2, "test9");
        pstm.execute();
        Savepoint sp = conn.setSavepoint();
        
        pstm.setString(1, "test10");
        pstm.setString(2, "test10");
        pstm.execute();
        Savepoint sp2 = conn.setSavepoint();
        
        
        conn.rollback();
        conn.commit();
        System.out.println("Insert OK " + sp.getSavepointId());


在這段程式碼中,程式已經被rollback,因此接下來的commit()是沒有任何意義的,但是如果將程式改為:

conn.rollback();
conn.commit(sp);

那麼接下來的commit()將是有意義的,資料庫中會記錄第一條資料.

因此仔細考慮如下程式碼:

try{
...
tx.commit();
}catch(Exception e)
{
    tx.rollback();
}

在這段程式碼中,丟擲的Exception一定是在commit()之前,或者在commit()執行沒有完畢的情況下.

因此對於這樣的程式碼:
try{
Savepoint sp=tx.setSavePoint();
...
tx.commit();
}catch(Exception e)
{
    ...
    tx.rollback(sp);
}

這樣的回滾就顯的沒有任何的意義.
除非在tx.rollback(sp)之後繼續進行tx.commit();