JDBC對事務的支援
阿新 • • 發佈:2018-12-09
事務要滿足四個條件:ACID
原子性:一個事務,要麼成功,要麼回滾(撤回)
一致性:事務開始前的資料要和結束後的資料保持一致。
隔離性:一個事務正在進行,另外的事務要等待。
永續性:事務提交後,資料的改變是永久性的。
JDBC對DML語言的操作是預設提交的。當有多個DML操作時,我們應該取消自動提交 。改為手動提交 。
但是這麼做的原因是什麼呢?給大家舉個例子。
就說銀行轉賬的例子,如果銀行中有一筆錢在轉出的過程中發生了異常,並且是自動提交的話會產生什麼樣的後果呢?
如果異常發生那麼就是銀行賬戶中這筆錢已經轉出,賬戶餘額變少了。但是收錢的賬戶卻沒收到錢,會產生這樣的後果。
為了避免這樣的事情發生,所以我們需要取消自動提交改為手動提交,這樣的改變的結果就是,如果銀行發生了異常
也不會提交給資料庫,資料庫中餘額並沒有發生改變,這也體現了事務的原子性,要麼成功,要麼回滾。
有以下方法:
Connection介面提供了一個方法:
void setAutoCommit(boolean flag):用於設定是否自動提交
true:表示自動提交
false:表示取消自動提交
void commit(): 提交事務
void rollback():事務回滾
列舉一個具體的轉賬的例子:
conn.setAutoCommit(false);//取消JDBC對事務的自動提交功能 1、轉出賬號先扣款 String updateSql = "update account_info1 set account_balence = ? where account_idcard = ?"; ps = conn.prepareStatement(updateSql); ps.setDouble(1, fromMoney - money); ps.setString(2, fromAccount); ps.executeUpdate(); 2、轉入賬戶增加金額 ps.setDouble(1, toMoney+money); ps.setString(2, toAccount); ps.executeUpdate(); map.put("message", "轉賬成功"); conn.commit();//手動提交事務 } catch (Exception e) { try { conn.rollback();//如果捕捉到異常就進行事務回滾處理 } catch (SQLException e1) { e1.printStackTrace(); } }