丟失更新:
這種事件發生在兩個事務讀取和嘗試更新同一數據時,其中一個更新會丟失。例如:事務 1 和事務 2 讀取同一行數據,并都根據所讀取的數據計算出該行的新值。如果事務 1 用其新值更新該行以后,事務 2 又更新了同一行,則事務 1 所執行的更新操作就丟失了。由于設計的方法,DB2 通用數據庫不允許發生此類現象。
臟讀:
當事務讀取尚未提交的數據時,就會發生這種事件。例如:事務 1 更改了一行數據,而事務 2 在事務 1 提交更改之前讀取了已更改的行。如果事務 1 回滾該更改,則事務 2 就會讀取被認為是不曾存在的數據。
不可重復的讀:
當一個事務兩次讀取同一行數據,但每次獲得不同的數據值時,就會發生這種事件。例如:事務 1 讀取了一行數據,而事務 2 在更改或刪除該行后提交了更改。當事務 1 嘗試再次讀取該行時,它會檢索到不同的數據值(如果該行已經被更新的話),或發現該行不復存在了(如果該行被刪除的話)。
幻像:
當最初沒有看到某個與搜索條件匹配的數據行,而在稍后的讀操作中又看到該行時,就會發生這種事件。例如:事務 1 讀取滿足某個搜索條件的一組數據行,而事務 2 插入了與事務 1 搜索條件匹配的新行。如果事務 1 再次執行產生原先行集的查詢,則會檢索到不同的行集。
維護數據庫一致性和數據完整性,但又允許多個應用程序同時訪問同一數據,這樣的特性稱為并發性。DB2 通用數據庫嘗試用來強制執行并發性的方法之一是通過使用隔離級別,它決定在第一個事務訪問數據時,如何對其它事務鎖定或隔離該事務所使用的數據。DB2 通用數據庫使用下列隔離級別來強制執行并發性:
可重復的讀(Repeatable Read)
讀穩定性(Read Stability)
游標穩定性(Cursor Stability)
未提交的讀(Uncommitted Read)
我們將在接下來依次討論每種級別。
“可重復的讀”隔離級別
當使用可重復的讀隔離級別時,在單個事務執行期間鎖定該事務引用的所有行。使用這種隔離級別時,同一事務多次發出的同一個 SELECT 語句將始終產生同一結果;丟失更新、臟讀、不可重復的讀、幻像都不會發生。
使用可重復的讀隔離級別的事務可以多次檢索同一行集,并可以對它們執行任意次操作,直到由提交或回滾操作終止事務;不允許其它事務執行插入、更新或刪除操作,因為這些操作會在隔離事務存在期間影響正在被使用的行集。為了確保在“可重復的讀”隔離級別下運行的事務所訪問的數據不會受其它事務的負面影響,所以鎖定了該隔離事務所引用的每個行 — 而不是僅鎖定被實際檢索和/或修改的那些行。因此,如果一個事務掃描了 1000 行但只檢索 10 行,則所掃描的 1000 行(而不僅是被檢索的 10 行)都會被鎖定。
那么在現實環境中這個隔離級別是如何工作的呢?假定您擁有一家大型旅館,并有一個網站,該網站按“先到先服務”的原則接受客戶的房間預訂。如果您的旅館預訂應用程序是在“可重復的讀”隔離級別下運行的,當客戶檢索某個日期段內的所有可用房間列表時,您將無法更改那些房間在指定日期范圍內的費用,而其他客戶也將無法進行或取消將會更改該列表的預訂,直到生成該列表的事務終止為止。(對于第一個客戶的查詢所指定范圍之外的任何房間,您都可以更改房價,其他客戶也都可以進行或取消房間預訂。)
“讀穩定性”隔離級別
當使用讀穩定性隔離級別時,在單個事務執行期間,會鎖定該事務所檢索的所有行。當使用這種隔離級別時,直到隔離事務終止之前,其它事務不能更改隔離事務讀取的所有行。此外,其它事務對其它行所作的更改,在提交之前對于運行在“讀穩定性”隔離級別下的事務而言是不可見的。因此,當使用“讀穩定性”隔離級別時,在同一事務中多次發出 SELECT 語句可能會產生不同的結果。丟失更新、臟讀和不可重復的讀都不會發生;但是,有可能出現幻像。
使用“可重復的讀”隔離級別時,隔離事務引用的每一行都被鎖定;但是,在“讀穩定性”隔離級別下,只鎖定隔離事務實際檢索和/或修改的行。因此,如果一個事務掃描了 1000 行但只檢索 10 行,則只有被檢索到的 10 行(而不是所掃描的 1000 行)被鎖定。
那么,這種隔離級別會如何改變旅館預訂應用程序的工作方式呢?現在,當一個客戶檢索某個日期段內的所有可用房間列表時,您可以更改旅館中任何房間的房價,而其他客戶也可以取消在第一個客戶的查詢所指定的日期段內所保留房間的預訂。因此,如果在終止提交查詢的事務之前再次生成列表,則產生的新列表中有可能包含新的房價或第一次產生列表時不可用的房間。
文章來源于領測軟件測試網 http://www.kjueaiud.com/