JDBC事務處理-四大原則
原子性
一致性
隔離性
持久性
第一步:實現轉賬操作
假設在賬戶中,蓋倫有余額5000元,趙信有余額2000元,
蓋倫要向趙信轉賬1000元。
public static void outMoney(Connection conn,String name,int account) throws SQLException{ String sql="update t_account set balance=balance-? where name=?"; PreparedStatement pst=conn.prepareStatement(sql); pst.setInt(1, account); pst.setString(2, name); int result=pst.executeUpdate(); pst.close(); } public static void inMoney(Connection conn,String name,int account) throws SQLException{ String sql="update t_account set balance=balance+? where name=?"; PreparedStatement pst=conn.prepareStatement(sql); pst.setInt(1, account); pst.setString(2, name); int result=pst.executeUpdate(); pst.close(); }
System.out.println("蓋倫正在給趙信轉賬1000元"); //轉賬操作 try { outMoney(conn,"蓋倫",1000); inMoney(conn,"趙信",1000); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { System.out.println("轉賬成功!"); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
運行:
正常轉賬成功。
假設 public static void inMoney(Connection conn,String name,int account)運行時出現意外。
人為構造意外
然后運行程序
查看數據庫的數據
蓋倫少了1000元,趙信余額沒有變!
這樣,趙信就坑了!!!
【改進】
所需要的函數
con.setAutoCommit(false); // 取消自動提交
con.rollback(); // 回滾
con.commit(); // 提交事務
Connection conn=null; try { conn = dbUtil.getConnection(); System.out.println("蓋倫正在給趙信轉賬1000元"); conn.setAutoCommit(false);//取消自動提交 outMoney(conn,"蓋倫",1000); inMoney(conn,"趙信",1000); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { try { conn.rollback();//回滾 } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); }finally{ try { conn.commit();//提交 conn.close(); } catch (SQLException e) { e.printStackTrace(); } }