轉載請註明原文地址:http://www.cnblogs.com/ygj0930/p/5868750.html html
關於事務的理論知識、ACID特性等等,網上太多了,在此不一一重複。本文主要着重 事務 這個工具在實際編程中是怎麼實現的。sql
在MySQL命令行的默認設置下,事務都是自動提交的,即執行SQL語句後就會立刻執行COMMIT操做,每個SQL語句都被認爲是一個完整的事務處理。數據庫
而咱們想要實現事務,即:執行多句SQL語句,再最終一塊兒提交或在出錯時撤銷(SQL語句要麼提交,要麼撤銷。提交則對數據庫形成永久性的影響,撤銷則事務內的sql語句至關於沒有執行)。編程
那麼咱們要作的就是:取消掉每個SQL語句執行後自動提交這個屬性,並設立一個開關(commit())執行一些列語句的同一提交操做。工具
取消SQL語句自動提交的方法有:spa
con.setAutoCommit(false):取消自動提交。則今後處開始,下面的一系列SQL語句除非遇到commit()命令,都不提交。命令行
具體的JDBC編程中事務的應用步驟以下:code
1) JDBC對事務的管理交由Connection,都是由Connection的對象方法實現的;htm
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(); }