1. 程式人生 > 其它 >mysql學習16 ( JDBC操作事務 )

mysql學習16 ( JDBC操作事務 )

mysql學習16

  • JDBC操作事務:

    • 事務:要麼都成功,要麼都失敗;

    • ACID原則:

      • 原子性:要麼都完成,要麼都不完成

      • 一致性:總數不變

      • 隔離性:多個程序互不干擾

      • 永續性:一旦提交不可逆,持久化到資料庫

    • 隔離性會產生問題:

      • 髒讀:一個事務讀取了另一個沒有提交的事務;

      • 不可重複讀:在同一個事務內,重複讀取表中資料,表資料發生了改變;(每次讀取不一樣)

      • 幻讀:在一個事務內,讀取到了別人插入的資料,導致前後讀取出來的結果不一樣(讀者讀者變多了)

 

  • 程式碼案例:

    • 開啟事務;

    • 一組業務執行完畢,提交事務;

    • 可以在catch語句中,顯式定義回滾語句,但是預設就會回滾;


    /**
    * 測試JDBC操作事務:
    *
    */
    public class TestDemo01 {

       public static void main(String[] args) {


           Connection conn =null;
           PreparedStatement st=null;
           ResultSet rs=null;

           try {
               conn= JdbcUtils.getConnection();//獲取連線

               /**
                * 操作事務:
                * 1,關閉資料庫的自動提交功能;
                * 2,業務完畢,提交事務
                * 3,如果失敗,就回滾事務
                */

               conn.setAutoCommit(false);//1,關閉資料庫的自動提交功能;會自動開啟事務

               String sql1="update account set money=money-100 where name='A'";
               st=conn.prepareStatement(sql1);
               st.executeUpdate();//執行1

               int x=1/0;//報錯

               String sql2="update account set money=money+100 where name='B'";
               st=conn.prepareStatement(sql2);
               st.executeUpdate();//執行2


               //業務完畢,提交事務
               conn.commit();
               System.out.println("成功");


          } catch (SQLException e) {
               try {
                   System.out.println("失敗,回滾事務");
                   conn.rollback();//如果失敗,就回滾事務;不寫也會預設回滾
              } catch (SQLException ex) {
                   ex.printStackTrace();
              }
               e.printStackTrace();
          }finally {
               JdbcUtils.release(conn,st,rs);
          }




      }
    }