
1.RR隔離級(jí)別:在此隔離級(jí)別下, DB2會(huì)鎖住所有相關(guān)的紀(jì)錄。 在一個(gè)SQL語(yǔ)句執(zhí)行期間, 所有執(zhí)行此語(yǔ)句掃描過(guò)的紀(jì)錄都會(huì)被加上相應(yīng)的鎖。在一個(gè)SQL語(yǔ)句執(zhí)行期間,所有執(zhí)行此語(yǔ)句掃描過(guò)的紀(jì)錄都會(huì)被加上相應(yīng)的鎖。 具體的鎖的類型還是由操作的類型來(lái)決定, 如果
1.RR隔離級(jí)別:在此隔離級(jí)別下, DB2會(huì)鎖住所有相關(guān)的紀(jì)錄。 在一個(gè)SQL語(yǔ)句執(zhí)行期間, 所有執(zhí)行此語(yǔ)句掃描過(guò)的紀(jì)錄都會(huì)被加上相應(yīng)的鎖。在一個(gè)SQL語(yǔ)句執(zhí)行期間,所有執(zhí)行此語(yǔ)句掃描過(guò)的紀(jì)錄都會(huì)被加上相應(yīng)的鎖。 具體的鎖的類型還是由操作的類型來(lái)決定, 如果是讀取,則加共享鎖; 如果是更新, 則加獨(dú)占鎖。具體的鎖的類型還是由操作的類型來(lái)決定,如果是讀取,則加共享鎖;如果是更新,則加獨(dú)占鎖。 由于會(huì)鎖定所有為獲得SQL語(yǔ)句的結(jié)果而掃描的紀(jì)錄, 所以鎖的數(shù)量可能會(huì)很龐大, 這個(gè)時(shí)候, 索引的增加可能會(huì)對(duì)SQL語(yǔ)句的執(zhí)行有很大的影響,因?yàn)樗饕龝?huì)影響SQL語(yǔ)句掃描的紀(jì)錄數(shù)量。由於會(huì)鎖定所有為獲得SQL語(yǔ)句的結(jié)果而掃描的紀(jì)錄,所以鎖 的數(shù)量可能會(huì)很龐大,這個(gè)時(shí)候,索引的增加可能會(huì)對(duì)SQL語(yǔ)句的執(zhí)行有很大的影響,因?yàn)樗饕龝?huì)影響SQL語(yǔ)句掃描的紀(jì)錄數(shù)量。
2.RS隔離級(jí)別:此隔離級(jí)別的要求比RR隔離級(jí)別稍弱,此隔離級(jí)別下會(huì)鎖定所有符合條件的紀(jì)錄。 不論是讀取, 還是更新, 如果SQL語(yǔ)句中包含查詢條件, 則會(huì)對(duì)所有符合條件的紀(jì)錄加相應(yīng)的鎖。不論是讀取,還是更新,如果SQL語(yǔ)句中包含查詢條件,則會(huì)對(duì)所有符合條件的紀(jì)錄加相應(yīng)的鎖。 如果沒有條件語(yǔ)句, 也就是對(duì)表中的所有記錄進(jìn)行處理,則會(huì)對(duì)所有的紀(jì)錄加鎖。如果沒有條件語(yǔ)句,也就是對(duì)錶中的所有記錄進(jìn)行處理,則會(huì)對(duì)所有的紀(jì)錄加鎖。
3.CS隔離級(jí)別:此隔離級(jí)別僅鎖住當(dāng)前處理的紀(jì)錄。
4.UR隔離級(jí)別:此隔離級(jí)別下,如果是讀取操作,不會(huì)出現(xiàn)任何的行級(jí)鎖。 對(duì)于非只讀的操作,它的鎖處理和CS相同。對(duì)於非只讀的操作,它的鎖處理和CS相同。
DB2默認(rèn)的隔離級(jí)別是CS。 DB2默認(rèn)的隔離級(jí)別是CS。 即游標(biāo)穩(wěn)定性。即游標(biāo)穩(wěn)定性。
在DB2中,共有四種隔離級(jí):RS,RR,CS,UR
eg:db2 select * from topicis.dm_qylx with ur
UR:UR-Uncommitted Read 未提交讀
是sql執(zhí)行時(shí)的一種隔離級(jí)別,允許臟讀,不加行鎖
不帶with UR的話,select count(1) 常見的是S鎖! update 應(yīng)該是X鎖;應(yīng)該會(huì)發(fā)生等待!
帶上with ur,select count(1) 應(yīng)該是IN鎖, update 是x鎖;剛好不會(huì)等待!
剛剛測(cè)試了下
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 條記錄已選擇。
這個(gè)時(shí)候的 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
在另外一個(gè) db2cmd 中
C:\>db2 +c update a set a=2
DB20000I SQL命令成功完成。
這時(shí)的 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
同樣的測(cè)試加上 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 條記錄已選擇。
這時(shí)的 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
在另外一個(gè) db2cmd 中
C:\>db2 +c update a set a=2
DB20000I SQL命令成功完成。
這時(shí)的 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
小結(jié):
1、ur(Uncommited Read):就是俗稱“臟讀“,在沒有提交數(shù)據(jù)的時(shí)候能夠讀到更新的數(shù)據(jù);即select數(shù)據(jù)時(shí),無(wú)需等待正在對(duì)數(shù)據(jù)進(jìn)行的update操作。
2、cs(Cursor Stability):在使用游標(biāo)穩(wěn)定性隔離級(jí)別時(shí),一個(gè)事務(wù)的結(jié)果集中只有正在被讀取的那一行(游標(biāo)指向的行)會(huì)被加上NS鎖,其他未被處理的行上不被加鎖。這種隔離級(jí)別只能保證正在被處理的行的值不會(huì)被其他并發(fā)的程序所改變。該隔離級(jí)別是DB2默認(rèn)的隔離級(jí)別。可以避免臟讀的發(fā)生,但無(wú)法避免不可重復(fù)讀和幻讀的情況發(fā)生。
3、rs(Read Stability):在一個(gè)事務(wù)中進(jìn)行查詢時(shí),不允許讀取其他事務(wù)update結(jié)果集中的數(shù)據(jù),允許讀取到其他事務(wù)提交的新增數(shù)據(jù)。會(huì)鎖定結(jié)果集中的所有行,會(huì)解決不可重復(fù)讀問題,但無(wú)法解決幻讀的問題。
4、rr(Repeatable Read):在一個(gè)事務(wù)中進(jìn)行查詢時(shí),不允許任何對(duì)這個(gè)查詢表的數(shù)據(jù)修改。對(duì)該表的操作徹底為序列化的形式,效率最低,可避免任何問題。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com