事務處理
阿新 • • 發佈:2020-08-16
事務:
具備一致性、原子性、隔離性
為了多條語句繫結生效,所以設定預設不提交,執行結束後統一提交
只要在提交前出現異常,則出現異常之前執行過的語句也不會產生資料持久化,因為資料還沒有提交
在過程中產生異常,需要將資料返回值操作之前,需要設定一個回滾點,但不是必須的,然後在出現異常時,啟動回滾
設定回滾點:
Savepoint point = con.setSavepoint();
啟動回滾:
//回滾事務:一般都是不需要設定回滾點的,因為會讓其直接回到執行前的原點
con.rollback();
//根據設定的回滾點位置,進行事務回滾
con.rollback(point);
/** * 事務處理 * 事務具備原子性和持久化的特性 * * 能夠將多條增刪改語句作為一個整體一起提交,完成持久化 * 如果其中有任意一條執行失敗,整個事務都將會回滾*/ public class Demo9 { public static void main(String[] args)throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/geekhome", "root", "tjhilu"); //將事務的自動提交方法更改為手動提交 con.setAutoCommit(false);//設定回滾點 Savepoint point = con.setSavepoint(); PreparedStatement pstmt = con.prepareStatement("update account set balance=balance-200 where cardid=1"); pstmt.executeUpdate(); if(true){ //回滾事務 //con.rollback(); //根據設定的回滾點位置,進行事務回滾 con.rollback(point); throw new RuntimeException("轉賬失敗"); }
PreparedStatement pstmt2 = con.prepareStatement("update account set balance=balance+200 where cardid=2"); pstmt2.executeUpdate(); //提交事務:為了多條語句繫結生效,所以設定預設不提交,執行結束後統一提交 con.commit(); pstmt.close(); con.close(); } }