事务概念
?
@Testpublic?void?testSaveMoney(){Connection?conn?=null;PreparedStatement?pstmt?=?null;String?accountId="123456789";double?money??=100;ResultSet?rs?=?null;String?sql?=?"Insert?into?inaccount?(accountid,inbalance)?values(?,?)";try?{conn?=?DBUtil.getCon();pstmt?=?conn.prepareStatement(sql);pstmt.setString(1,?accountId);pstmt.setDouble(2,?money);pstmt.executeUpdate();sql?=?"update?account?set?balance=balance+??where?accountid=?";pstmt?=?conn.prepareStatement(sql);pstmt.setDouble(1,?money);pstmt.setString(2,?accountId);boolean?flag?=?true;if(flag){throw?new?SQLException("因網絡或不明原因出異常!");}pstmt.executeUpdate();}?catch?(Exception?e)?{//?TODO?Auto-generated?catch?blocke.printStackTrace();}finally{DBUtil.close(conn,?pstmt,?rs);}}如果不使用事務操作,對于一個銀行業務來說是致命的,上面的這個示例,造成的結果就是一個inaccount表中會插入一條數據,而account表中沒有任何改變。
事務的類型:
自動提交:執行update馬上保存數據
手動提交:執行update不保存數據,先放入緩存,只有執行Commit,才保存
設置事務:
?
@Testpublic?void?testSaveMoney(){Connection?conn?=null;PreparedStatement?pstmt?=?null;String?accountId="123456789";double?money??=100;ResultSet?rs?=?null;String?sql?=?"Insert?into?inaccount?(accountid,inbalance)?values(?,?)";try?{conn?=?DBUtil.getCon();conn.setAutoCommit(false);pstmt?=?conn.prepareStatement(sql);pstmt.setString(1,?accountId);pstmt.setDouble(2,?money);pstmt.executeUpdate();sql?=?"update?account?set?balance=balance+??where?accountid=?";pstmt?=?conn.prepareStatement(sql);pstmt.setDouble(1,?money);pstmt.setString(2,?accountId);boolean?flag?=?true;if(flag){throw?new?SQLException("因網絡或不明原因出異常!");}pstmt.executeUpdate();//提交事務conn.commit();}?catch?(Exception?e)?{//?TODO?Auto-generated?catch?block//回滾事務,回滾到conn.setAutoCommit(false);try?{conn.rollback();}?catch?(SQLException?e1)?{//?TODO?Auto-generated?catch?blocke1.printStackTrace();}e.printStackTrace();}finally{DBUtil.close(conn,?pstmt,?rs);}}?
在事務沒有提交之前,數據時先放到緩存中的,但是事務提交時會將數據保存到表中并清空緩存,rollback的原理也是清空緩存這樣就不會出現上面的問題
?
總結
- 上一篇: 在Ubuntu 14.04中使Subli
- 下一篇: JBPM学习(五):流程变量