- 搞定J2EE核心技術與企業應用
- 常建功 王向華編著
- 669字
- 2018-12-29 13:50:10
7.4 JDBC高級應用——事務處理
事務處理由若干個步驟組成,所有步驟必須同時操作成功或者失敗。當所有的步驟都操作成功時,事務就算操作成功了;而當其中某一個步驟操作失敗時,則該步驟之前的操作就必須撤銷。例如,在一個銀行交易系統中,假如一個數據庫表用來存放客戶的存款金額,另一個數據庫表用來存放客戶的交易歷史。客戶進行交易操作的過程,就是一個典型的事務。當客戶取錢時,一方面要改變客戶的存款金額,另一方面要增加客戶的交易歷史記錄,要么都成功,要么都失敗,不能改變了客戶的存款金額,卻沒有任何交易記錄。
7.4.1 事務處理概述
事務的特性包括原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durabilily)。
● 原子性:表示事務是否完全完成,若因為任何原因導致其中的一個步驟操作失敗,則所有步驟都操作失敗,前面已經完成的步驟也必須回滾,系統將返回到事務開始前的狀態。
● 一致性:表示當事務執行失敗時,所有被該事務影響的數據都應該恢復到事務執行前的狀態。
● 隔離性:表示在事務執行過程中對數據的修改,在事務提交之前對其他事務是不可見的。
● 持久性:表示對數據的操作應該是持久性。
7.4.2 如何應用事務處理
要進行事務處理,就離不開事務的設定、開始事務、執行SQL、提交事務及事務失敗后的回滾。下面是一個典型的應用事務處理將數據新增到數據庫的過程;
public void insert() throws Exception{ //取得連接 Class.forName("org.postgresql.Driver"); String url ="JDBC:postgresql://localhost/ testDb " String user="postgres"; String password=" postgres "; Connection conn= DriverManager.getConnection(url,user,password); try { //開始進行事務處理 conn.setAutoCommit(false); Statement stmt = con.createStatement(); String sql = "insert into user (username, password) values('" + username + "', '" + password + "')"; //執行新增語句 int counts = stmt.executeUpdate(sql); if (counts != 0) { infoOut.put("msg", "新增成功"); } else { infoOut.put("msg", "新增失敗"); } //事務提交 con.commit(); } catch (SQLException e) { e.printStackTrace(); } catch(Exception e){ //事務回滾 con.rollback(); e.printStackTrace(); } finally { //關閉連接 con.close(); } }