轉載請注明原文地址:http://www.cnblogs.com/ygj0930/p/5868750.html
關於事務的理論知識、ACID特性等等,網上太多了,在此不一一重復。本文主要着重 事務 這個工具在實際編程中是怎么實現的。
在MySQL命令行的默認設置下,事務都是自動提交的,即執行SQL語句后就會馬上執行COMMIT操作,每一個SQL語句都被認為是一個完整的事務處理。
而我們想要實現事務,即:執行多句SQL語句,再最終一起提交或在出錯時撤銷(SQL語句要么提交,要么撤銷。提交則對數據庫造成永久性的影響,撤銷則事務內的sql語句相當於沒有執行)。
那么我們要做的就是:取消掉每一個SQL語句執行后自動提交這個屬性,並設立一個開關(commit())執行一些列語句的同一提交操作。
取消SQL語句自動提交的方法有:
con.setAutoCommit(false):取消自動提交。則從此處開始,下面的一系列SQL語句除非遇到commit()命令,都不提交。
具體的JDBC編程中事務的應用步驟如下:
1) JDBC對事務的管理交由Connection,都是由Connection的對象方法實現的;
2) 首先關閉自動提交,開啟事務:void Connection.setAutoCommit(false); // false表示關閉自動提交
3) 然后就是事務中包含的一系列SQL語句
4) 提交事務:con.commit(); // 顯式提交
5) 回滾:如果在事務執行過程中出錯(用try-catch語句捕捉),則在錯誤處理語句中顯式回滾:con.rollback();
6) 中間點:一般的事務回滾是回滾到事務開始之前,但是也可以只回滾到事務中的某個中間點。
設置中間點
i. Savepoint Connection.setSavepoint(); // 在事務的某個位置設置一個中間點,該中間點沒有命名,使用系統默認的命名
ii. Savepoint setSavepoint(String name); // 給中間點命名
iii. 回滾到指定的中間點:connection.rollback(Savepoint savepoint); // 回滾到指定的中間點
代碼樣例:
try { conn.setAutoCommit(false); String sql1="。。。"; stmt.executeUpdate(sql); String sql2="。。。"; stmt.executeUpdate(sq2); String sql3="。。。"; stmt.executeUpdate(sq3); conn.commit(); } catch (Exception e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); }