db2 隔離級別 試驗

2021-08-31 19:28:44 字數 4531 閱讀 6984

準備工作

db2命令列下,執行:list command options,如圖:

[img]

注意,auto commit預設是on,即自動提交。使用下面的命令來檢視設定:

執行命令:

update command options using c off,

再執行命令:list command options,如圖:

[img]

這時可以看到auto commit 已經變為off了

db2使用乙個叫做「current isolation」的special register來記錄session的隔離級別。檢視當前隔離級別有兩種方法:

values current isolation

或select current isolation from sysibm.sysdummy1

設定隔離級別命令如下(此命令不需要顯式commit):

set current isolation to ur/cs/rs/rr

由於該測試需要併發事務,所以我們要用同樣方法,再開啟乙個視窗。以下稱為session1和session2。

把兩個session都連線到dingtest資料庫,並建一張表ta如下:

ac1 ac2

1 12 2

3 34 4

5 5至此準備工作完成,我們開始實驗。

注:每次實驗完以後別忘記清理環境,即把session commit/rollback。

實驗1

測試在「ur」隔離級別下是否會產生「丟失更新」的問題。

方法:兩個session併發更新同一條記錄。

step 0:把session1和session2都設定為ur隔離級別:

set current isolation to ur

step 1:在session1中做更新操作,但不提交:

update ta set ac2 = 2 where ac1 = 1

step 2:在session2中對同一條記錄做更新操作:

update ta set ac2 = 3 where ac1 = 1

session2被block住……

step 3:在session1中做commit/rollback操作,則session2會立刻繼續執行。

結論:在「ur」隔離級別下不會產生「丟失更新」的問題。

實驗2

測試在「ur」隔離級別下是否會產生「讀髒資料」的問題。

方法:在session2中查詢session1中更改但未提交的資料。

step 0:把兩個session都設定為ur隔離級別:

set current isolation to ur

step 1:在session1中做更新操作,但不提交:

update ta set ac2 = 4 where ac1 = 1

step 2:在session2中查詢該記錄:

select * from ta where ac1 = 1

session2中立即返回查詢結果,該記錄值為session1更新後的值,這實際是乙個髒資料,session1有可能最終會rollback。

step 3:在session1中做rollback操作。

step 4:在session2中再次查詢該記錄。

select * from ta where ac1 = 1

該記錄值為session1更新前的值,因為session1已經rollback了,第一次讀到的是乙個髒資料。

結論:在「ur」隔離級別下會產生「讀髒資料」的問題

實驗3

測試在「cs」隔離級別下是否會產生「讀髒資料」的問題。

方法:在session2中查詢session1中更改但未提交的資料。

step 0:把兩個session都設定為cs隔離級別:

set current isolation to cs

step 1:在session1中做更新操作,但不提交:

update ta set ac2 = 5 where ac1 = 1

step 2:在session2中查詢該記錄:

select * from ta where ac1 = 1

session2被block住……

step 3:在session1中做commit/rollback操作,則session2會立刻繼續執行。

結論:在「cs」隔離級別下不會產生「讀髒資料」的問題。

實驗4

測試在「cs」隔離級別下會是否會產生「不可重複讀」的問題。

方法:嘗試在session1的兩次查詢之間修改其查詢的記錄。

step 0:把兩個session都設定為cs隔離級別:

set current isolation to cs

step 1:在session1中做查詢操作,但不提交:

select * from ta where ac1 = 1

假定查詢結果中ac2為「4」。

step 2:在session2中更新此記錄,並提交(不提交的話,session1就無法再查詢該記錄了):

update ta set ac2 = 5 where ac1 = 1

commit

step 3:在session1中再次查詢該記錄:

select * from ta where ac1 = 1

這次查詢結果中,ac2為「5」。這就產生了在同乙個事務中,兩次查詢的資料不一致的問題。

結論:在「cs」隔離級別下會產生「不可重複讀」的問題

實驗5

測試在「rs」隔離級別下是否會產生「不可重複讀」的問題。

方法:嘗試在session1的兩次查詢之間修改其查詢的記錄。

step 0:把兩個session都設定為rs隔離級別:

set current isolation to rs

step 1:在session1中做查詢操作,但不提交:

select * from ta where ac1 = 1

假定查詢結果中ac2為5

step 2:在session2中更新此記錄:

update ta set ac2 = 6 where ac1 = 1

session2被block住……

step 3:在session1中再次查詢該記錄:

select * from ta where ac1 = 1

這次查詢結果中,ac2仍然為5。這表明在rs隔離級別下,在事務中,查詢的記錄都被lock住了,以保證同一事務中,多次查詢的資料都一致。

step 4:在session1中做commit/rollback操作,則session2立即繼續執行。

結論:在「rs」隔離級別下不會產生「不可重複讀」的問題。

實驗6

測試在「rs」隔離級別下是否會產生「幻象記錄」的問題。

方法:嘗試在session1的兩次查詢之間新增符合其查詢條件的記錄。

step 0:把兩個session都設定為rs隔離級別:

set current isolation to rs

step 1:在session1中做查詢操作,但不提交:

select * from ta where ac1 > 0 and ac1 < 10

假定查詢結果有5條記錄。

step 2:在session2中insert一條記錄,並提交:

insert into ta (ac1, ac2) values (6, 1)

commit

step 3:在session1中做同樣的查詢操作:

select * from ta where ac1 > 0 and ac1 < 10

這次查詢結果中,變成了6條記錄。這就產生了在同乙個事務中,兩次查詢的資料不一致的問題。雖然第一次查到的記錄都被lock住了不會被改變,但若在兩次查詢之間,其它session若新插入了記錄,則在第二次查詢中也會被查到。該記錄被稱為幻象(phantom)記錄。

結論:在「rs」隔離級別下會產生「幻象記錄」的問題

實驗7

測試在「rr」隔離級別下是否會產生「幻象記錄」的問題。

方法:嘗試在session1的兩次查詢之間新增符合其查詢條件的記錄。

step 0:把兩個session都設定為rr隔離級別:

set current isolation to rr

step 1:在session1中做查詢操作,但不提交:

select * from ta where ac1 > 0 and ac1 < 10

假定查詢結果有6條記錄。

step 2:在session2中insert一條記錄:

insert into ta (ac1, ac2) values (7, 1)

session2被block住了……

step 3:在session1中做同樣的查詢操作:

select * from ta where ac1 > 0 and ac1 < 10

查詢結果仍為6條記錄,且資料和第一次查詢保持一致。

step 4:在session1中做commit/rollback操作

則session2立即繼續執行。

結論:在「rr」隔離級別下不會產生「幻象記錄」的問題。

db2 隔離級別

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

db2 隔離級別 詳解

table b jdbc隔離級別 b b 資料庫隔離級別 b b 資料訪問情況 b transaction read uncommitted 未提交的讀 uncommitted read ur 就是俗稱 髒讀 dirty read 在沒有提交資料時能夠讀到已經更新的資料 transaction re...

DB2事務隔離級別

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