標籤:地方 base set where dem main one exception jdbc
1、事務的概念:
事務指邏輯上的一組操作,組成這組操作的各個單元,要麼全部成功,要麼全部不成功。
2、 管理事務:
2.1. 資料庫預設的事務
資料庫預設支援事務的,但是資料庫預設的事務是一條sql語句獨佔一個事務,這種模式,意義不大。
2.2.手動控制事務
如果希望自己控制事務也是可以的:
start transaction;
-- 開啟事務,在這條語句之後的所有的sql將處在同一事務中,要麼同時完成要麼同時不完成
......
--事務中的sql在執行時,並沒有真正修改資料庫中的資料
commit;
-- 提交事務,將整個事務對資料庫的影響一起發生
rollback;
-- 復原事務,將這個事務對資料庫的影響取消掉
2.3. JDBC中控制事務
Connection conn
PreparedStatement pstat
ResultSet rs
當Jdbc程式向資料庫獲得一個Connection對象時,預設情況下這個Connection對象會自動向資料庫提交在它上面發送的SQL語句。若想關閉這種預設提交方式,讓多條SQL在一個事務中執行,可使用下列語句:
conn.setAutoCommit(false);
--關閉自動認可後,conn將不會幫我們提交事務,在這個串連上執行的所有sql語句將處在同一事務中,需要我們是手動的進行提交或復原
conn.commit();
--提交事務
conn.rollback();
--復原事務
也可以設定復原點復原部分事務。
Savepoint sp = conn.setSavepoint();
conn.rollback(sp);
--注意,回到復原點後,復原點之前的代碼雖然沒被復原但是也沒提交呢,如果想起作用還要做commit操作.
public class TranDemo { public static void main(String[] args) { Connection conn = null; PreparedStatement pstat = null; Savepoint sp =null; try{ //String url = "jdbc:mysql://ip:3306/database"; String url = "jdbc:mysql:///day20"; Class.forName("com.mysql.jdbc.Driver"); conn= DriverManager.getConnection(url, "root", "root"); //開啟事務 conn.setAutoCommit(false); //a-520 pstat = conn.prepareStatement("update account set " + "money=money-? where name=?"); pstat.setDouble(1, 520); pstat.setString(2, "a"); pstat.executeUpdate(); //b+520 pstat = conn.prepareStatement("update account set " + "money=money+? where name=?"); pstat.setDouble(1, 520); pstat.setString(2, "b"); pstat.executeUpdate(); //設定復原點 sp= conn.setSavepoint(); //b消費了1040 pstat = conn.prepareStatement("update account set " + "money=money-? where name=?"); pstat.setDouble(1, 1040); pstat.setString(2, "b"); pstat.executeUpdate(); //人為拋出一個異常 int x = 3/0; //a+1040 pstat = conn.prepareStatement("update account set " + "money=money+? where name=?"); pstat.setDouble(1, 1040); pstat.setString(2, "a"); pstat.executeUpdate(); //提交事務 conn.commit(); }catch (Exception e) { if(conn!=null){ if(sp!=null){ try { //復原到到sp conn.rollback(sp); //將轉賬的操作提交 conn.commit(); } catch (SQLException e1) { e1.printStackTrace(); } }else{ try { //復原事務開啟的地方 conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } } }finally{ //關閉資料庫連接。。。。 } }}
Java-交易管理