準備工作
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 可重新性,可 重複讀是最高的隔離級別,提供了最大程度的鎖定和最少的並行。產生結果集的所有行都會被鎖定,也就是說,即使不必出現在最終結果集中的行也會被鎖定。在此 該工作單元結束前,任...