事務隔離級別
儘管數據庫爲用戶提供了鎖的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以保證數據的讀一致性,不過用戶可以根據應用的需要選擇適合的隔離等級。