一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。
斷開與資料庫的連線
表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗
表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態
事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。
永續性事務完成之後,它對於系統的影響是永久性的。
sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。
在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read)。
這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。這種隔離級別 也支援所謂的不可重複讀(nonrepeatable read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。
這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另乙個棘手的問題:幻讀 (phantom read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。
這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
這四種隔離級別採取不同的鎖型別來實現,若讀取的是同乙個資料的話,就容易發生問題。
例如: 在mysql中,實現了這四種隔離級別,分別有可能產生問題如下所示:
下面,將利用mysql的客戶端程式,分別測試幾種隔離級別。測試資料庫為test,表為tx;表結構如下:
兩個命令列客戶端分別為a,b;不斷改變a的隔離級別,在b端修改資料。
將a的隔離級別設定為 read uncommitted (未提交讀)
在b未更新資料之前:
客戶端a:
b更新資料:
客戶端b:
客戶端a:
經過上面的實驗可以得出結論,事務b更新了一條記錄,但是沒有提交,此時事務a可以查詢出未提交記錄。造成 髒讀 現象。 read uncommitted (未提交讀)是最低的隔離級別。
將客戶端a的事務隔離級別設定為 read committed (已提交讀)
在b未更新資料之前:
客戶端a:
b更新資料:
客戶端b:
客戶端a:
經過上面的實驗可以得出結論,已提交讀隔離級別解決了髒讀的問題,但是出現了不可重複讀的問題,即事務a在兩次查詢的資料不一致,因為在兩次查詢之間事務b更新了一條資料。已提交讀只允許讀取已提交的記錄,但不要求可重複讀。
將a的隔離級別設定為 repeatable read (可重複讀)
在b未更新資料之前:
客戶端a:
b更新資料:
客戶端b:
客戶端a:
b插入資料:
客戶端b:
客戶端a:
由以上的實驗可以得出結論,可重複讀隔離級別只允許讀取已提交記錄,而且在乙個事務兩次讀取乙個記錄期間,其他事務部的更新該記錄。但該事務不要求與其他事務可序列化。例如,當乙個事務可以找到由乙個已提交事務更新的記錄,但是可能產生幻讀問題(注意是可能,因為資料庫對隔離級別的實現有所差別)。像以上的實驗,就沒有出現資料幻讀的問題。
將a的隔離級別設定為 serializable (可序列化)
a端開啟事務,b端插入一條記錄
事務a端:
事務b端:
因為此時事務a的隔離級別設定為 serializable ,開始事務後,並沒有提交,所以事務b只能等待。
事務a提交事務:
事務a端:
事務b端:
注意: serializable 是完全鎖定欄位的,若乙個事務來查詢同乙份資料就必須等待,直到前乙個事務完成並解除鎖定為止 。是完整的隔離級別,會鎖定對應的資料**,因而會有效率的問題。
事務的隔離級別舉例 JDBC 事務隔離級別
本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...
事務的隔離級別舉例 事務的隔離級別
乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...
JDBC事務隔離級別
如果dbms支援事務處理,它必須有某種途徑來管理兩個事務同時對乙個資料庫進行操作時可能發生的衝突。使用者可指定事務隔離級別,以指明dbms應該花多大精力來解決潛在衝突。例如,當事務更改了某個值而第二個事務卻在該更改被提交或還原前讀取該值時該怎麼辦。假設第乙個事務被還原後,第二個事務所讀取的更改值將是...