讀操作未提交(Read Uncommitted)
讀操作已提交(Read Committed)
可重復讀(Repeatable Read)
可序列化(Serializable)
隔離級別是根據稱為現象(Phenomena)的三個禁止操作序列來聲明的:
髒讀(Dirty Read)
不可重復讀(Non-Repeatable Read)
幻像讀(Phantom Read)
如果訪問方法不支持“可序列化”,則符合特定查詢的數據集在事務內可能由於另一個事務進行了更新而發生更改。如果發生這樣的情況,那麼用戶要知道受支持的是什麼級別,這一點很重要,以便他們可以據此設計應用程序。“現象”定義了符合的數據集在事務中可能更改的方式。
髒讀
如果一個事務在提交操作結果之前,另一個事務可以看到該結果,就會發生這種情況。請考慮以下示例:
事務 1 Write(a) Rollback
事務 2 Read(a)
如果事務 2 讀取了事務 1 所寫的值,則“髒讀”就發生了。
不可重復讀(也稱為模糊讀 (Fuzzy Read))
如果一個事務在提交結果之前,另一個事務可以修改和刪除它,就會發生這種情況。以下演示了這一點:
事務 1 Read(a) Read(a)
事務 2 Write/Delete(a) Commit
如果事務 1 每次從 Read 上獲取了不同的結果,就會發生“不可重復讀”。
幻像讀
如果一個事務在提交查詢結果之前,另一個事務可以更改該結果,就會發生這種情況。以下演示了這一點:
事務 1 Select(標准) Select(標准)
事務 2 Update/Create(與標准匹配) Commit
如果事務 1 每次從 Select 上獲取了不同的結果,就會發生“幻像讀”。
定義的 SQL-92 隔離級別
SQL-92 隔離級別是根據發生何種“現象”而定義的:
隔離級別 P1 P2 P3
讀操作未提交 是 是 是
讀操作已提交 否 是 是
可重復讀 否 否 是
可序列化 否 否 否
因此如果支持“讀操作已提交”,則您就決不會遇到“髒讀”,但您可能會遇到“不可重復讀”或“幻像讀”。
上面的次序是根據“強度”排列的,與“讀操作已提交”相比,“讀操作未提交”受到的限制比較少,因而它的“強度”就比較小,或者說處於(隔離的)“較低級別”。
您的代碼可能需要調用 mi_scan_isolevel() 以驗證是否支持當前請求的級別。使用隔離的較高級別總是有效支持較低級別,但當您使用隔離的較低級別時不能要求得到較高級別的支持。這樣的話,如果 DataBlade 支持“可序列化”,則不需要調用 mi_scan_isolevel(),因為所有的級別都低於“可序列化”。
mi_scan_isolevel() 記錄在 Virtual-Table Interface Programmer's Manual 中,而且它返回服務器正期望用於訪問方法的隔離級別。加上級別在“讀操作已提交”和“可重復讀”之間的“游標穩定性”(Cursor Stability),這些返回值與上面解釋的 ANSI SQL-92 級別相符合。Informix 服務器支持該級別,但它事實上不是 SQL-92 的一部分。DataBlade 應該通過支持“可重復讀”或“可序列化”來支持“游標穩定性”。從 mi_scan_isolevel() 實際返回的值定義在 miami.h 中,如下所示:
MI_ISO_NOTRANSACTION
MI_ISO_READUNCOMMITTED
MI_ISO_ READCOMMITTED
MI_ISO_ CURSORSTABILITY