db2 隔離級別 詳解

2021-08-31 19:28:44 字數 4052 閱讀 6419

[table]

|[b]jdbc隔離級別[/b]|[b]資料庫隔離級別[/b]|[b]資料訪問情況[/b]|

|transaction_read_uncommitted(未提交的讀)uncommitted read|ur|就是俗稱「髒讀」(dirty read),在沒有提交資料時能夠讀到已經更新的資料|

|transaction_read_committed (游標穩定性)cursor stability|cs|在乙個事務中進行查詢時,允許讀取提交前的資料,資料提交後,當前查詢就可以讀取到資料。update資料時候並不鎖住表|

|transaction_repeatable_read (讀穩定性)read stability|rs|在乙個事務中進行查詢時,不允許讀取其他事務update的資料,允許讀取到其他事務提交的新增資料|

|transaction_serializable (可重複的讀)repeatable read|rr|在乙個事務中進行查詢時,不允許任何對這個查詢表的資料修改。|

[/table]

「可重複的讀」隔離級別rr

當使用可重複的讀隔離級別時,在單個事務執行期間鎖定該事務引用的所有行。使用這種隔離級別時,同一事務多次發出的同乙個 select 語句將始終產生同一結果;丟失更新、髒讀、不可重複的讀、幻像都不會發生。

使用可重複的讀隔離級別的事務可以多次檢索同一行集,並可以對它們執行任意次操作,直到由提交或回滾操作終止事務;不允許其它事務執行插入、更新或刪除操作,因為這些操作會在隔離事務存在期間影響正在被使用的行集。為了確保在「可重複的讀」隔離級別下執行的事務所訪問的資料不會受其它事務的負面影響,所以鎖定了該隔離事務所引用的每個行 — 而不是僅鎖定被實際檢索和/或修改的那些行。因此,如果乙個事務掃瞄了 1000 行但只檢索 10 行,則所掃瞄的 1000 行(而不僅是被檢索的 10 行)都會被鎖定。

那麼在現實環境中這個隔離級別是如何工作的呢?假定您擁有一家大型旅館,並有乙個**,該**按「先到先服務」的原則接受客戶的房間預訂。如果您的旅館預訂應用程式是在「可重複的讀」隔離級別下執行的,當客戶檢索某個日期段內的所有可用房間列表時,您將無法更改那些房間在指定日期範圍內的費用,而其他客戶也將無法進行或取消將會更改該列表的預訂,直到生成該列表的事務終止為止。(對於第乙個客戶的查詢所指定範圍之外的任何房間,您都可以更改房價,其他客戶也都可以進行或取消房間預訂。)

「讀穩定性」隔離級別rs

當使用讀穩定性隔離級別時,在單個事務執行期間,會鎖定該事務所檢索的所有行。當使用這種隔離級別時,直到隔離事務終止之前,其它事務不能更改隔離事務讀取的所有行。此外,其它事務對其它行所作的更改,在提交之前對於執行在「讀穩定性」隔離級別下的事務而言是不可見的。因此,當使用「讀穩定性」隔離級別時,在同一事務中多次發出 select 語句可能會產生不同的結果。丟失更新、髒讀和不可重複的讀都不會發生;但是,有可能出現幻像。

使用「可重複的讀」隔離級別時,隔離事務引用的每一行都被鎖定;但是,在「讀穩定性」隔離級別下,只鎖定隔離事務實際檢索和/或修改的行。因此,如果乙個事務掃瞄了 1000 行但只檢索 10 行,則只有被檢索到的 10 行(而不是所掃瞄的 1000 行)被鎖定。

那麼,這種隔離級別會如何改變旅館預訂應用程式的工作方式呢?現在,當乙個客戶檢索某個日期段內的所有可用房間列表時,您可以更改旅館中任何房間的房價,而其他客戶也可以取消在第乙個客戶的查詢所指定的日期段內所保留房間的預訂。因此,如果在終止提交查詢的事務之前再次生成列表,則產生的新列表中有可能包含新的房價或第一次產生列表時不可用的房間。

「游標穩定性」隔離級別cs

當使用游標穩定性隔離級別時,只要隔離事務所用的游標定位在某一行上,就會鎖定該游標所引用的這一行。所獲取的鎖一直有效,直到游標重定位(通常通過呼叫 fetch 語句)或隔離事務終止為止。因此,當使用這種隔離級別時,在同一事務中多次發出 select 語句可能會產生不同的結果。丟失更新和髒讀不會發生;但有可能出現不可重複的讀和幻像。

當使用「游標穩定性」隔離級別的事務通過可更新游標從表中檢索行時,在游標定位在該行上時,其它事務不能更新或刪除該行。但是,如果被鎖定的行本身不是用索引訪問的,那麼其它事務可以將新的行新增到表,並對位於被鎖定行前後的行進行更新和/或刪除操作。此外,如果隔離事務修改了它檢索到的任何行,那麼在隔離事務終止之前,即使在游標不再位於這個被修改的行,其它事務不能更新或刪除該行。

其它事務在其它行上進行的更改,在提交之前對於使用「游標穩定性」隔離級別的事務是不可見的。預設情況下,大多數事務都使用「游標穩定性」隔離級別。

這種隔離級別對旅館預訂應用程式有什麼影響呢?現在,當乙個客戶檢索某個日期段內的所有可用房間列表,然後檢視關於所產生的列表上每個房間的資訊時(每次檢視乙個房間),您可以更改旅館中任何房間的房價,而其他客戶可以對任何日期段的任何房間進行或取消預訂;唯一的例外是第乙個客戶當前正在檢視的房間。當第乙個客戶檢視列表中另乙個房間的資訊時,對於這個新房間也是一樣;您現在可以更改第乙個客戶剛才檢視的房間的房價,其他客戶也可以預訂該房間,但不能對第乙個客戶當前正在檢視的房間進行這些操作。

「未提交的讀」隔離級別ur

在使用未提交的讀隔離級別的情況中,當單個事務檢索行時,僅當另乙個事務試圖刪除或更改被檢索的行所在的表時,才會在單個事務期間鎖定這些行。因為在使用這種隔離級別時,行通常保持未鎖定狀態,所以丟失更新、髒讀、不可重複的讀和幻像都可能會發生。

在大多數情況下,其它事務對行所作的更改,在提交或回滾之前對於使用「未提交的讀」隔離級別的事務是可見的。但是,此類事務不能看見或訪問其它事務所建立的表、檢視或索引,直到那些事務被提交為止。類似地,如果其它事務刪除了現有的表、檢視或索引,使用「未提交的讀」隔離級別的事務僅當進行刪除操作的事務終止時才能了解這一情況。這種行為有乙個例外:當執行在「未提交的讀」隔離級別下的事務使用可更新游標時,該事務的行為和在「游標穩定性」隔離級別下執行一樣,並應用「游標穩定性」隔離級別的約束。

「未提交的讀」隔離級別通常用於那些訪問唯讀表的事務和/或某些執行 select 語句的事務,這些語句對其它事務的未提交資料沒有負面效果。

那麼這種隔離級別對旅館預訂應用程式有什麼影響呢?現在,當乙個客戶檢索某個日期段內的所有可用房間列表時,您可以更改旅館中任何房間的房價,而其它客戶也可以對任何日期段內的任何房間進行或取消預訂。此外,如果其它客戶取消了預訂,即使他們還沒有終止其事務並將那些取消提交到資料庫,所生成的列表就可以包含這些取消預訂的房間了。

2. 資料庫之間的差異: 1).oracle通過具有意向鎖的多粒度封鎖機制進行併發控制,保證資料的一致性。其dml鎖(資料鎖)分為兩個層次(粒度):即表級和行級。通常的dml操作在表級獲得的只是意向鎖(rs或rx),其真正的封鎖粒度還是在行級;db2也是通過具有意向鎖的多粒度封鎖機制進行併發控制,保證資料的一致性。其dml鎖(資料鎖)分為兩個層次(粒度):即表級和行級。通常的dml操作在表級獲得的只是意向鎖(is,six或ix),其真正的封鎖粒度也是在行級;另外,在oracle資料庫中,單純地讀資料(select)並不加鎖,這些都提高了系統的併發程度,oracle強調的是能夠"讀"到資料,並且能夠快速的進行資料讀取。而db2的鎖強調的是"讀一致性",進行讀資料(select)時會根據不同的隔離級別(rr,rs,cs)而分別加 s,is,is鎖,只有在使用ur隔離級別時才不加鎖。從而保證不同應用程式和使用者讀取的資料是一致的。

2). 在支援高併發度的同時,db2和oracle對鎖的操縱機制有所不同:oracle利用意向鎖及資料行上加鎖標誌位等設計技巧,減小了oracle維護行級鎖的開銷,使其在資料庫併發控制方面有著一定的優勢。而db2中對每個鎖會在鎖的記憶體(locklist)中申請分配一定位元組的記憶體空間,具體是x鎖 64位元組記憶體,s鎖32位元組記憶體(注:db2 v8之前是x鎖72位元組記憶體而s鎖36位元組記憶體)。

3). oracle資料庫中不存在鎖公升級,而db2資料庫中當資料庫表中行級鎖的使用超過locklist*maxlocks會發生鎖公升級。

4). 在oracle中當乙個session對錶進行insert,update,delete時候,另外乙個session仍然可以從orace回滾段或者還原表空間中讀取該錶的前映象(before image); 而在db2中當乙個session對錶進行insert,update,delete時候,另外乙個session仍然在讀取該錶資料時候會處於lock wait狀態,除非使用ur隔離級別可以讀取第乙個session的未提交的值;所以oracle同一時刻不同的session有讀不一致的現象,而 db2在同一時刻所有的session都是"讀一致"的。 5). db2預設下是使用cs級別,oracle預設是使用ur

db2 隔離級別

1.當事務在多使用者環境中沒有彼此隔離時,將會產生以下三種後果 1 髒讀 這種情況發生在乙個事務讀取還未提交的資料時。例如 事務1改變了一行資料,而在事務1提交修改之前事務2讀取了事務1所改變的行的資料。如果事務1回滾了修改,那末事務2就讀取了實際上並不存在的資料。2 不可重複讀 這種情況發生在事務...

DB2事務隔離級別

select from tablename where id 1with ur4 rr repeatable read 可重新性,可 重複讀是最高的隔離級別,提供了最大程度的鎖定和最少的並行。產生結果集的所有行都會被鎖定,也就是說,即使不必出現在最終結果集中的行也會被鎖定。在此 該工作單元結束前,任...

db2 隔離級別 試驗

準備工作 db2命令列下,執行 list command options,如圖 img 注意,auto commit預設是on,即自動提交。使用下面的命令來檢視設定 執行命令 update command options using c off,再執行命令 list command options,...