Java-交易管理

來源:互聯網
上載者:User

標籤:地方   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-交易管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.