Java setAutoCommit 默認為true,即每條SQL語句在各自的一個事務中執行。
很多時候需要有多個操作在一個事務執行,如循環插入,此時可在插入開始前設置 conn.setAutoCommit(false) ,插入結束后才conn.commit(),並在catch中執行conn.rollback()。這樣即使插入中間報錯,前面執行沒報錯的也會回滾,從而保證數據的完整性。正確寫法示例如下:

1 Connection con = null; 2 try { 3 con = getConnection(); 4 con.setAutoCommit(false); 5 /* 6 * do what you want here. 7 */ 8 con.commit(); 9 } catch (Throwable e) { 10 if (con != null) { 11 try { 12 con.rollback();// 設定setAutoCommit(false)若沒有在catch中進行Connection的rollBack操作,操作的表就會被鎖住,造成數據庫死鎖。雖然在執行con.close()的時候會釋放鎖,但若應用服務器使用了數據庫連接池,連接不會被斷開,從而不會放鎖 13 } catch (SQLException e1) { 14 e1.printStackTrace(); 15 } 16 } 17 18 throw new RuntimeException(e); 19 } finally { 20 if (con != null) { 21 try { 22 con.close(); 23 } catch (SQLException e) { 24 e.printStackTrace(); 25 } 26 } 27 }
需要注意的是:設定setAutoCommit(false)若沒有在catch中進行Connection的rollBack操作,操作的表就會被鎖住,造成數據庫死鎖。雖然在執行con.close()的時候會釋放鎖,但若應用服務器使用了數據庫連接池,連接不會被斷開,從而不會放鎖