1. 程式人生 > >Java-事務管理

Java-事務管理

pri getc 自己 forname rollback ger [] string 將不

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-事務管理