Java Connection.setAutoCommit


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         }
View Code

需要注意的是:設定setAutoCommit(false)若沒有在catch中進行Connection的rollBack操作,操作的表就會被鎖住,造成數據庫死鎖。雖然在執行con.close()的時候會釋放鎖,但若應用服務器使用了數據庫連接池,連接不會被斷開,從而不會放鎖

 

參考資料:http://ygsilence.iteye.com/blog/1297762


免責聲明!

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



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