DB2隔離級別之RR/RS/CS/UR


  1.RR隔離級別:在此隔離級別下。 DB2會鎖住所有相關的紀錄。

在一個SQL語句運行期間, 所有運行此語句掃描過的紀錄都會被加上對應的鎖。在一個SQL語句運行期間,所有運行此語句掃描過的紀錄都會被加上對應的鎖。sql

詳細的鎖的類型仍是由操做的類型來決定, 假設是讀取。則加共享鎖; 假設是更新。 則加獨佔鎖。詳細的鎖的類型仍是由操做的類型來決定。假設是讀取,則加共享鎖;假設是更新,則加獨佔鎖。 因爲會鎖定所有爲得到SQL語句的結果而掃描的紀錄, 因此鎖的數量可能會很是龐大, 這個時候, 索引的添加可能會對SQL語句的運行有很是大的影響。因爲索引會影響SQL語句掃描的紀錄數量。由於會鎖定所有為得到SQL語句的結果而掃描的紀錄,因此鎖 的數量可能會很是龐大,這個時候,索引的添加可能會對SQL語句的運行有很是大的影響。因為索引會影響SQL語句掃描的紀錄數量。

2.RS隔離級別:此隔離級別的要求比RR隔離級別稍弱,此隔離級別下會鎖定所有符合條件的紀錄。 不管是讀取, 仍是更新, 假設SQL語句中包括查詢條件, 則會對所有符合條件的紀錄加對應的鎖。併發

不管是讀取。仍是更新,假設SQL語句中包括查詢條件,則會對所有符合條件的紀錄加對應的鎖。post

假設沒有條件語句。 也就是對錶中的所有記錄進行處理。則會對所有的紀錄加鎖。假設沒有條件語句,也就是對錶中的所有記錄進行處理,則會對所有的紀錄加鎖。

 3.CS隔離級別:此隔離級別僅鎖住當前處理的紀錄。spa



4.UR隔離級別:此隔離級別下,假設是讀取操做,不會出現不論什麼的行級鎖。 對於非僅僅讀的操做。它的鎖處理和CS一樣。對於非僅僅讀的操做。它的鎖處理和CS一樣。.net



DB2默認的隔離級別是CS。code

DB2默認的隔離級別是CS。blog

即遊標穩定性。即遊標穩定性。
在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命令成功完畢。ip



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


小結:

<span style="font-size:18px;"><strong><span style="font-size:18px;">一、ur(Uncommited Read):就是俗稱「髒讀「,在沒有提交數據的時候能夠讀到更新的數據。即select數據時。無需等待正在對數據進行的update操做。

</span></strong></span>

<span style="font-size:18px;"><strong><span style="font-size:18px;">
二、cs(Cursor Stability):在使用遊標穩定性隔離級別時。一個事務的結果集中僅僅有正在被讀取的那一行(遊標指向的行)會被加上NS鎖。其它未被處理的行上不被加鎖。這樣的隔離級別僅僅能保證正在被處理的行的值不會被其它併發的程序所改變。

該隔離級別是DB2默認的隔離級別。

能夠避免髒讀的發生,但沒法避免不可反覆讀和幻讀的狀況發生。</span></strong></span>

<span style="font-size:18px;"><strong><span style="font-size:18px;"></span><span style="font-size:18px;">
三、rs(Read Stability):在一個事務中進行查詢時,不一樣意讀取其它事務update結果集中的數據,贊成讀取到其它事務提交的新增數據。會鎖定結果集中的所有行。會解決不可反覆讀問題,但沒法解決幻讀的問題。

</span></strong></span>

<span style="font-size:18px;"><strong><span style="font-size:18px;">
四、rr(Repeatable Read):在一個事務中進行查詢時,不一樣意不論什麼對這個查詢表的數據改動。

對該表的操做完全爲序列化的形式,效率最低,可避免不論什麼問題。</span></strong></span>

相關文章
相關標籤/搜索