
1.RR隔離級別:在此隔離級別下, DB2會鎖住所有相關的紀錄。 在一個SQL語句執行期間, 所有執行此語句掃描過的紀錄都會被加上相應的鎖。在一個SQL語句執行期間,所有執行此語句掃描過的紀錄都會被加上相應的鎖。 具體的鎖的類型還是由操作的類型來決定, 如果
1.RR隔離級別:在此隔離級別下, DB2會鎖住所有相關的紀錄。 在一個SQL語句執行期間, 所有執行此語句掃描過的紀錄都會被加上相應的鎖。在一個SQL語句執行期間,所有執行此語句掃描過的紀錄都會被加上相應的鎖。 具體的鎖的類型還是由操作的類型來決定, 如果是讀取,則加共享鎖; 如果是更新, 則加獨占鎖。具體的鎖的類型還是由操作的類型來決定,如果是讀取,則加共享鎖;如果是更新,則加獨占鎖。 由于會鎖定所有為獲得SQL語句的結果而掃描的紀錄, 所以鎖的數量可能會很龐大, 這個時候, 索引的增加可能會對SQL語句的執行有很大的影響,因為索引會影響SQL語句掃描的紀錄數量。由於會鎖定所有為獲得SQL語句的結果而掃描的紀錄,所以鎖 的數量可能會很龐大,這個時候,索引的增加可能會對SQL語句的執行有很大的影響,因為索引會影響SQL語句掃描的紀錄數量。
2.RS隔離級別:此隔離級別的要求比RR隔離級別稍弱,此隔離級別下會鎖定所有符合條件的紀錄。 不論是讀取, 還是更新, 如果SQL語句中包含查詢條件, 則會對所有符合條件的紀錄加相應的鎖。不論是讀取,還是更新,如果SQL語句中包含查詢條件,則會對所有符合條件的紀錄加相應的鎖。 如果沒有條件語句, 也就是對表中的所有記錄進行處理,則會對所有的紀錄加鎖。如果沒有條件語句,也就是對錶中的所有記錄進行處理,則會對所有的紀錄加鎖。
3.CS隔離級別:此隔離級別僅鎖住當前處理的紀錄。
4.UR隔離級別:此隔離級別下,如果是讀取操作,不會出現任何的行級鎖。 對于非只讀的操作,它的鎖處理和CS相同。對於非只讀的操作,它的鎖處理和CS相同。
DB2默認的隔離級別是CS。 DB2默認的隔離級別是CS。 即游標穩定性。即游標穩定性。
在DB2中,共有四種隔離級:RS,RR,CS,UR
eg:db2 select * from topicis.dm_qylx with ur
UR:UR-Uncommitted Read 未提交讀
是sql執行時的一種隔離級別,允許臟讀,不加行鎖
不帶with UR的話,select count(1) 常見的是S鎖! update 應該是X鎖;應該會發生等待!
帶上with ur,select count(1) 應該是IN鎖, update 是x鎖;剛好不會等待!
剛剛測試了下
C:\>db2 create table a(a int)
DB20000I SQL命令成功完成。
C:\>db2 insert into a values(1)
DB20000I SQL命令成功完成。
C:\>db2 commit
DB20000I SQL命令成功完成。
C:\>db2 +c select count(*) from a
1
-----------
1
1 條記錄已選擇。
這個時候的 lock 的情況是
C:\>db2pd -d test -lock
Database Partition 0 -- Database TEST -- Active -- Up 0 days 00:20:49
Locks:
Address TranHdl Lockname Type Mode Sts Owner
Dur HoldCount Att ReleaseFlg
0x05190450 2 53514C4332463041F12CF8E241 Internal P ..S G 2
1 0 0x00 0x40000000
在另外一個 db2cmd 中
C:\>db2 +c update a set a=2
DB20000I SQL命令成功完成。
這時的 lock 情況如下
C:\>db2pd -d test -lock
Database Partition 0 -- Database TEST -- Active -- Up 0 days 00:21:03
Locks:
Address TranHdl Lockname Type Mode Sts Owner
Dur HoldCount Att ReleaseFlg
0x051911E0 6 05000F00040000050000000052 Row ..X G 6
1 0 0x00 0x40000000
0x05190450 2 53514C4332463041F12CF8E241 Internal P ..S G 2
1 0 0x00 0x40000000
0x05190300 6 53514C4332463041F12CF8E241 Internal P ..S G 6
1 0 0x00 0x40000000
0x051911B0 6 05000F00000000000000000054 Table .IX G 6
1 0 0x00 0x40000000
__________________
The More You Know The More You're Worth
http://macrozeng.itpub.net
macrozeng#itpub.net
同樣的測試加上 for read only with ur
C:\>db2 commit
DB20000I SQL命令成功完成。
C:\>db2 +c select count(*) from a for read only with ur
1
-----------
1
1 條記錄已選擇。
這時的 lock 情況如下
C:\>db2pd -d test -lock
Database Partition 0 -- Database TEST -- Active -- Up 0 days 00:27:56
Locks:
Address TranHdl Lockname Type Mode Sts Owner
Dur HoldCount Att ReleaseFlg
0x05191B70 2 53514C4332463041F12CF8E241 Internal P ..S G 2
1 0 0x00 0x40000000
在另外一個 db2cmd 中
C:\>db2 +c update a set a=2
DB20000I SQL命令成功完成。
這時的 lock 情況如下
C:\>db2pd -d test -lock
Database Partition 0 -- Database TEST -- Active -- Up 0 days 00:28:23
Locks:
Address TranHdl Lockname Type Mode Sts Owner
Dur HoldCount Att ReleaseFlg
0x05190330 6 05000F00040000050000000052 Row ..X G 6
1 0 0x00 0x40000000
0x05191B70 2 53514C4332463041F12CF8E241 Internal P ..S G 2
1 0 0x00 0x40000000
0x05190570 6 53514C4332463041F12CF8E241 Internal P ..S G 6
1 0 0x00 0x40000000
0x05191240 6 05000F00000000000000000054 Table .IX G 6
1 0 0x00 0x40000000
小結:
1、ur(Uncommited Read):就是俗稱“臟讀“,在沒有提交數據的時候能夠讀到更新的數據;即select數據時,無需等待正在對數據進行的update操作。
2、cs(Cursor Stability):在使用游標穩定性隔離級別時,一個事務的結果集中只有正在被讀取的那一行(游標指向的行)會被加上NS鎖,其他未被處理的行上不被加鎖。這種隔離級別只能保證正在被處理的行的值不會被其他并發的程序所改變。該隔離級別是DB2默認的隔離級別。可以避免臟讀的發生,但無法避免不可重復讀和幻讀的情況發生。
3、rs(Read Stability):在一個事務中進行查詢時,不允許讀取其他事務update結果集中的數據,允許讀取到其他事務提交的新增數據。會鎖定結果集中的所有行,會解決不可重復讀問題,但無法解決幻讀的問題。
4、rr(Repeatable Read):在一個事務中進行查詢時,不允許任何對這個查詢表的數據修改。對該表的操作徹底為序列化的形式,效率最低,可避免任何問題。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com