搞懂JDBC事務機制,真的很簡單

一、關於事務的基本知識

事務是什麼

  • 事務通常用於操作數據庫,也稱數據庫事務,數據庫事務是由一系列的sql語句組成

事務的特點

  • 事務中的sql語句,要麼都執行,要麼都不執行

JDBC的事務機制

  • JDBC事務是自動提交的,什麼是自動提交呢?
  • 自動提交就是事務的DML(增加、刪除、修改)sql語句,執行一次就提交一次結果

但在實際業務中,通過都是N條DML語句共同聯合完成的,必須保證在同一事務的DML語句同時完成或同時失敗,下面用例子說明

二、JDBC事務機制例子

簡單的業務場景

  • 賬戶111給賬戶222轉錢
  • 執行一個update語句,讓賬戶111從原有的10變成0
  • 執行一個update語句,讓賬戶222從原有的0變成10
  • 如果在這兩個update語句中間發生代碼異常,
  • 那麼根據JDBC事務自動提交,兩個賬戶的錢都會變爲0

這種情況在現實生活中發生,那兩方不就虧大發了嘛,進一步說公司離倒閉就不遠了

三行代碼解決上述問題

		//開啓事務,將自動提交改爲手動提交
		conn.setAutoCommit(false);
		//提交事務
		conn.commit();
		//回滾事務,如果代碼沒有執行commit方法,事務回滾到之前的狀態
		conn.rollback();

三、代碼實現

public class JDBCTest11 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            //註冊驅動
            Class.forName("com.mysql.jdbc.Driver");
            //獲取連接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/selfproj?useUnicode=true&characterEncoding=utf8","root","123456");
			
			//開啓事務
            //將自動提交機制修改爲手動提交
            conn.setAutoCommit(false);

            //創建預編譯數據庫操作對象
            String sql = "update t_act set balance = ? where actno=?";
            ps=conn.prepareStatement(sql);

            //給?佔位符傳值
            ps.setDouble(1,0);
            ps.setInt(2,111);
            //1.執行第一個update語句
            int count = ps.executeUpdate();

            //這裏發生空指針異常
            String s =null;
            s.toString();

            //給?佔位符傳值
            ps.setDouble(1,10);
            ps.setInt(2,222);
            //2.執行第二個sql語句
            count+= ps.executeUpdate();

            System.out.println(count==2 ? "轉賬成功":"轉賬失敗");

            //程序能夠走到這裏說明以上沒有異常,事務結束,手動提交數據
            conn.commit();//提交事務
        }catch (Exception e){
            if (conn != null) {
                try {
                    //回滾事務,如果代碼出現異常沒有執行commit方法,回滾事務
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        }finally{
            //釋放資源
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

附上sql腳本

		drop table if exists t_act;
		create table t_act(
		    actno int,
		    balance double(7,2)
		);
		insert into t_act(actno,balance) values(111,10);
		insert into t_act(actno,balance) values(222,0);
		commit;
		select * from t_act

四、總結

java中只需要將自動提交事務改爲手動提交事務,如果出現代碼異常,就回滾到原有的狀態

小聲bb:原本以爲事務是一個高大上的東西,其實在之前自考就學習過,果然實踐纔是硬道理
對了到mybatis框架時會用到事務哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章