概述
資料庫事務(database transaction) ,是指作為單個邏輯工作單元執行的一系列操作。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成為事務,必須滿足所謂的acid(原子性、一致性、隔離性和永續性)屬性。
資料庫事務的acid屬性
原子性(atomic)
事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。如果系統只執行這些操作的乙個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。
一致性(consistent)
事務在完成時,必須使所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。事務結束時,所有的內部資料結構(如 b 樹索引或雙向鍊錶)都必須是正確的。某些維護一致性的責任由應用程式開發人員承擔,他們必須確保應用程式已強制所有已知的完整性約束。例如,當開發用於轉帳的應用程式時,應避免在轉帳過程中任意移動小數點。
隔離性(insulation)
由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。這稱為可序列性,因為它能夠重新裝載起始資料,並且重播一系列事務,以使資料結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將獲得最高的隔離級別。在此級別上,從一組可並行執行的事務獲得的結果與通過連續執行每個事務所獲得的結果相同。由於高度隔離會限制可並行執行的事務數,所以一些應用程式降低隔離級別以換取更大的吞吐量。防止資料丟失
永續性(durability)
事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。
事務隔離級別
儘管資料庫為使用者提供了鎖的dml操作方式,但直接使用鎖管理是非常麻煩的,因此資料庫為使用者提供了自動鎖機制。只要使用者指定會話的事務隔離級別,資料庫就會分析事務中的sql語句,然後自動為事務操作的資料資源新增上適合的鎖。此外資料庫還會維護這些鎖,當乙個資源上的鎖數目太多時,自動進行鎖公升級以提高系統的執行效能,而這一過程對使用者來說完全是透明的。
ansi/iso sql 92標準定義了4個等級的事務隔離級別,在相同資料環境下,使用相同的輸入,執行相同的工作,根據不同的隔離級別,可以導致不同的結果。不同事務隔離級別能夠解決的資料併發問題的能力是不同的。
表 1 事務隔離級別對併發問題的解決情況
隔離級別
髒讀 不可重複讀
幻象讀第一類丟失更新
第二類丟失更新
read uncommited
允許 允許
允許 不允許
允許 read committed
不允許允許 允許
不允許允許
repeatable read
不允許不允許
允許 不允許
不允許
serializable
不允許不允許
不允許不允許
不允許事務的隔離級別和資料庫併發性是對立的,兩者此增彼長。一般來說,使用read uncommited隔離級別的資料庫擁有最高的併發性和吞吐量,而使用serializable隔離級別的資料庫併發性最低。
sql 92定義read uncommited主要是為了提供非阻塞讀的能力,oracle雖然也支援read uncommited,但它不支援髒讀,因為oracle使用多版本機制徹底解決了在非阻塞讀時讀到髒資料的問題並保證讀的一致性,所以,oracle的read committed隔離級別就已經滿足了sql 92標準的repeatable read隔離級別。
sql 92推薦使用repeatable read以保證資料的讀一致性,不過使用者可以根據應用的需要選擇適合的隔離等級。
MySQL事務的四個隔離級別解析
概述 資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單...
Js SQL 事務的四個隔離級別
事務的四個隔離級別 4個 read uncommitted 讀未提交 read committed 讀已提交 repeatable read 可重複讀 serializable 序列化 read uncommitted 讀未提交 事務a和事務b,事務a未提交的資料,事務b可以讀取到,這裡讀到的資料可...
怎麼理解SQL的四個事務隔離級別?
事務的隔離級別是為了解決併發問題。那麼先來了解下併發帶來的問題 1 丟失更新 lost update 沒有加鎖 兩個事務同時更新一行資料,最後乙個事務的更新會覆蓋掉第乙個事務的更新,從而導致第乙個事務更新的資料丟失,這是由於沒有加鎖造成的。2 髒讀dirty reads 沒有隔離 乙個事務看到了另外...