1. 程式人生 > >JDBC對事務的支援

JDBC對事務的支援

 事務要滿足四個條件: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();
			}
		}