1.對於同時執行的多個事務,當這些事務訪問資料庫中相同的資料時,如果沒有採取必要的隔離機制,就會導致各種併發問題:
–髒讀: 對於兩個事物t1, t2, t1讀取了已經被t2更新但還沒有被提交的字段。之後, 若t2回滾,t1讀取的內容就是臨時且無效的。
–不可重複讀: 對於兩個事物 t1, t2, t1 讀取了乙個字段, 然後t2更新了該字段.之後, t1再次讀取同乙個字段,值就不同了。
–幻讀: 對於兩個事物t1, t2, t1 從乙個表中讀取了乙個字段,然後 t2在該表中插入了一些新的行。之後, 如果t1再次讀取同乙個表,就會多出幾行.
2.資料庫事務的隔離性: 資料庫系統必須具有隔離併發執行各個事務的能力,使它們不會相互影響, 避免各種併發問題。
3.乙個事務與其他事務隔離的程度稱為隔離級別.資料庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高, 資料一致性就越好, 但併發性越弱。
4.資料庫提供的4種事務隔離級別:
-oracle 支援的2 種事務隔離級別:read commited, serializable。 oracle預設的事務隔離級別為: read commited。
-mysql支援 4 中事務隔離級別,mysql預設的事務隔離級別為: repeatable read。
5.在mysql設定隔離級別
-每啟動乙個 mysql程式,就會獲得乙個單獨的資料庫連線。每個資料庫連線都有乙個全域性變數 @@tx_isolation ,表示當前的事務隔離級別。 mysql預設的隔離級別為 repeatable read
-檢視當前的隔離級別: select@@tx_isolation;
-設定當前 mysql連線的隔離級別: set transaction isolation level read committed;
-設定資料庫系統的全域性的隔離級別: set global transaction isolation levelread committed;
6.隔離級別測試
public void testtransactionisolationread()
@suppresswarnings("unchecked")
public e getforvalue(string sql, object... args)
// 1. 得到結果集
resultset = preparedstatement.executequery();
if (resultset.next())
} catch (exception ex) finally
return null;
}
JDBC資料庫事務
事務 一組邏輯操作單元,使資料從一種狀態變換到另一種狀態。事務處理 事務操作 保證所有事務都作為乙個工作單元來執行,即使出現了故障,都不能改變這種執行方式。當在乙個事務中執行多個操作時,要麼所有的事務都被提交 commit 那麼這些修改就永久地儲存下來 要麼資料庫管理系統將放棄所作的所有修改,整個事...
JDBC 資料庫事務
事務 一組邏輯操作單元,使資料從一種狀態變換到另一種狀態。事務處理 也稱為事務操作,保證所有事務都作為乙個工作單元來執行,即使出現了故障,都不能改變這種執行方式。當在乙個事務中執行多個操作時,要麼所有的事務都被提交 commit 那麼這些修改就永久的儲存下來 要麼資料庫管理系統將丟棄所作的所有修改,...
JDBC 之 資料庫事務
原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務必須使資料庫從乙個一致性狀態變換到另外乙個一致性狀態。隔離性 isolation 事務的隔離性是指乙個事務的執行不能被其他事務干擾,即乙個事務內部的操作及使用...