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();
}
}
