事務的概念:數據庫
事務指邏輯上的一組操做,組成這組操做的各個單元,要麼所有成功,要麼所有不成功。
事務的特性:併發
A:原子性(Atomicity):說明事務是一個不可分割的單位。 C:一致性(Consistency):事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態.(好比轉帳) *I:隔離性(Isolation):一個事務不能被其餘事務打擾。 D:持久性(Durability):事務一旦提交,就應該被永久保存起來。
事務的隔離級別:性能
未提交讀(READ UNCOMMITTED):髒讀、不可重複讀、虛讀都有可能發生。 (隔離級別最低,併發性能高) 提交讀/不可重複讀(READ COMMITTED):能避免髒讀,不可重複讀、虛讀都有可能發生。 (鎖定正在讀取的行 ,Oracle默認的隔離級別) 可重複讀(REPEATABLE READ):能避免髒讀、不可重複度,虛讀有可能發生。 (鎖定所讀取的全部行 ,MySQL默認的隔離級別) 可串行化(SERIALIZABLE):能避免髒讀、不可重複度、虛讀。 (鎖表)
說明:線程
1)多個線程開啓各自事務操做數據庫中數據時,數據庫系統要負責隔離操做,以保證各個線程在獲取數據時的準確性。 2)MySQL中Innodb引擎經過數據庫鎖(表鎖和行鎖)來實現事務的隔離。 3)若是不考慮事務的隔離級別,會出現如下「不正確」的狀況: 1>髒讀:指一個事務讀到了另外一個事務中未提交的數據。 2>不可重複讀:在一個事務內讀取表中的某一行數據,屢次讀取的結果不一樣。重點是修改 注:不可重複讀和髒讀的區別是:髒讀是讀取了另外一個事務中未提交的髒數據,不可重複讀是讀取了另外一個事務已提交了的數據。 3>虛讀(幻讀):在一個事務內讀取到了另外一個事務插入的數據,致使先後讀取的記錄數不一致。重點在於新增或者刪除
JDBC中設置事務的隔離級別:code
Connection.setTransactionIsolation(int level); // Level:Connection中的常量 // 在開啓事務前先設置隔離級別 Conn.setTransactionIsolation(Connection.*); Conn.setAutoCommit(false);
MySQL中控制事務隔離級別的語句:事務
查看當前事務的隔離級別: select @@tx_isolation; 設置當前事務隔離級別: set transaction isolation level 隔離級別;