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