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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章