inix鎖信息問題介紹.doc_第1頁
inix鎖信息問題介紹.doc_第2頁
inix鎖信息問題介紹.doc_第3頁
inix鎖信息問題介紹.doc_第4頁
inix鎖信息問題介紹.doc_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 理解鎖什么是鎖?鎖 是一種軟件機(jī)制,用于控制對數(shù)據(jù)庫中的數(shù)據(jù)的訪問。在出現(xiàn)同時(shí)讀取和更新數(shù)據(jù)的多用戶環(huán)境中,鎖能夠確保每個(gè)事務(wù)的原子性、隔離、一致性和持續(xù)性(ACID)不受到威脅,并且維護(hù)數(shù)據(jù)的完整性。鎖的粒度Informix 提供各種粒度的鎖。它們是: 數(shù)據(jù)庫鎖:針對整個(gè)數(shù)據(jù)庫的鎖 表鎖:針對整個(gè)表的鎖 頁鎖:針對整頁數(shù)據(jù)的鎖 行鎖:針對一個(gè)數(shù)據(jù)行的鎖 字節(jié)鎖:在包含 VARCHAR 的行上的鎖 鍵鎖:在索引中的一個(gè)鍵值上的鎖 鎖的粒度越粗,它就能鎖住越多的數(shù)據(jù)庫對象。例如,對于能夠在一個(gè)磁盤頁上包含 4 行的表,在該頁放置一個(gè)鎖將鎖住其中包含的所有 4 個(gè)行。相反,如果使用行鎖,那么將僅鎖住一個(gè)行。因此,鎖的粒度越粗,并發(fā)性就越低,從而影響到性能,尤其是應(yīng)用程序試圖訪問相同的行集時(shí)。不過,粗粒度也意味著在某些情況下鎖住相同數(shù)量的行需要的鎖數(shù)量更少。例如,鎖住整個(gè)表僅需要一個(gè)表鎖。表的鎖模式創(chuàng)建一個(gè)表時(shí),它的默認(rèn)鎖粒度是頁鎖??梢栽趧?chuàng)建表的過程中使用 LOCK MODE 子句覆蓋默認(rèn)值。例如:CREATE TABLE t1(c1 int) LOCK MODE ROW;這個(gè)上下文中的鎖模式表明訪問表時(shí)需要使用的鎖的粒度。如果從 CREATE SQL 語句省略掉這個(gè) LOCK MODE 子句,那么就使用默認(rèn)的鎖模式。 如果表已經(jīng)創(chuàng)建,那么可以使用 ALTER TABLE 語句更改鎖模式。對于以上提到的表 t1 例子,您可以使用下面的 ALTER 語句將鎖模式從行鎖更改頁鎖:dbaccess db1 -ALTER TABLE t1 LOCK MODE(PAGE);可以使用配置參數(shù) DEF_TABLE_LOCKMODE 更改已創(chuàng)建的表的默認(rèn)鎖模式。該參數(shù)的值可以是 ROW 或 PAGE。例如,如果 DEF_TABLE_LOCKMODE 設(shè)置為 ROW,那么數(shù)據(jù)庫服務(wù)器重啟之后創(chuàng)建的表的默認(rèn)鎖模式將為 ROW。類似地,可以使用環(huán)境變量 IFX_DEF_TABLE_LOCKMODE 實(shí)現(xiàn)相同的效果。注意:如果從運(yùn)行 oninit 以啟動服務(wù)器的窗口設(shè)置環(huán)境變量,那么通過環(huán)境變量指定的默認(rèn)鎖模式將對所有會話有效。然而,如果僅在特定客戶端會話環(huán)境中設(shè)置鎖模式,那么它僅對特定會話有效。清單 1 - 4 顯示了檢查表的鎖模式的不同方法(表名為 t1;數(shù)據(jù)庫名為 db1):清單 1. 使用 dbschemadbschema -d db1 -t t1 -ss 清單 2. 輸出create table informix.t1 ( c1 integer ) extent size 16 next size 16 lock mode row;清單 3. 使用 oncheckoncheck -pt db1:t1Output:TBLspace Report for db1:informix.t1 Physical Address 1:64070 Creation date 07/14/2009 04:51:27 TBLspace Flags 802 Row Locking TBLspace use 4 bit bit-maps Maximum row size 4 Number of special columns 0 Number of keys 0 Number of extents 1 Current serial value 1 Current SERIAL8 value 1 Current BIGSERIAL value 1 Current REFID value 1 Pagesize (k) 2 First extent size 8 Next extent size 8 Number of pages allocated 8 Number of pages used 1 Number of data pages 0 Number of rows 0 Partition partnum 1049067 Partition lockid 1049067 Extents Logical Page Physical Page Size Physical Pages 0 1:64999 8 8清單 4. 使用 dbaccess 從數(shù)據(jù)庫的系統(tǒng)目錄表查詢系統(tǒng)表dbaccess db1 - select * from systables where tabname=t1;tabname t1owner informixpartnum 1049067tabid 100rowsize 4ncols 1nindexes 0nrows 0.00created 07/14/2009version 6553601tabtype Tlocklevel Rnpused 0.00fextsize 16nextsize 16flags 0sitedbnametype_xid 0am_id 0pagesize 2048ustlowtssecpolicyid 0protgranularity字段 “l(fā)ocklevel” 為 R,表明這是一個(gè)行鎖。另外,使用 onstat -k 來監(jiān)控鎖模式。這將在 “使用 onstat 實(shí)用程序監(jiān)控鎖” 小節(jié)進(jìn)行介紹?;仨撌祖i的類型數(shù)據(jù)庫、表、頁和行(在這個(gè)小節(jié)中統(tǒng)稱為對象)通過不同類型的鎖來控制對自身的訪問。IDS 使用以下類型的鎖:共享鎖當(dāng)需要讀取數(shù)據(jù)并且不允許更改行時(shí),那么就可以在該對象(比如表、頁或行)上設(shè)置一個(gè)共享鎖。一個(gè)對象可以由不同的會話設(shè)置多個(gè)共享鎖。因此,可以在需要時(shí)在一個(gè)對象上設(shè)置多個(gè)共享鎖。更新/提升鎖可以在需要更新的對象上設(shè)置更新鎖。如果一個(gè)對象已經(jīng)設(shè)置了共享鎖,另一個(gè)會話還可以在其上設(shè)置一個(gè)更新鎖。如果需要更改對象,那么更新鎖必須提升為獨(dú)占鎖。不過,為了實(shí)現(xiàn)獨(dú)占鎖,在提升過程中該對象不能包含共享鎖或更新鎖。獨(dú)占鎖當(dāng)一個(gè)會話請求單獨(dú)使用某個(gè)對象時(shí),可以在該對象上放置一個(gè)獨(dú)占鎖。如果一個(gè)對象上已經(jīng)放置了獨(dú)占鎖,那么其他會話就不能再在該對象上放置其他類型的鎖。INSERT、UPDATE 和 DELETE 語句在它們所更改的行上使用這個(gè)鎖。在事務(wù)完成之后將釋放該鎖。onstat 實(shí)用程序和 syslocks 表使用以下符號表示鎖的類型: 共享鎖 - S 更新鎖 - U 獨(dú)占鎖 - X 在某些情況下,可以通過放置一個(gè)意向鎖(intent lock)來表明要放置特定鎖的意向。例如,意向共享鎖的表示符號為 IS。在使用 SELECT 語句期間通??梢栽诒砩峡吹?IS 鎖。在使用 INSERT、UPDATE 或 DELETE 語句期間通常可以在表上看到意向獨(dú)占鎖。 表 1 使用這些符號列出了一個(gè)兼容性矩陣,顯示當(dāng)一個(gè)會話已經(jīng)在某個(gè)對象上放置了特定的鎖時(shí),另一個(gè)會話可以在該對象上請求的鎖。表 1. 鎖兼容性矩陣持有 X 鎖持有 U 鎖持有 S 鎖持有 IS 鎖持有 SIX 鎖持有 IX 鎖請求 X 鎖No No No No No No 請求 U 鎖No No Yes Yes No No 請求 S 鎖No Yes Yes Yes No No 請求 IS 鎖No Yes Yes Yes Yes Yes 請求 SIX 鎖No No No Yes No No 請求 IX 鎖No No No Yes No Yes 回頁首鎖請求失敗當(dāng)會話請求鎖失敗時(shí),數(shù)據(jù)庫服務(wù)器的默認(rèn)行為是返回一個(gè)錯誤。要讓該會話等待擁有鎖的會話釋放鎖,請?jiān)谶\(yùn)行預(yù)定語句之前運(yùn)行以下 SQL 語句:SET LOCK MODE TO WAIT;這將讓會話一直等到鎖釋放。如果要設(shè)置固定的等待期限(例如,5 秒),則使用以下語句:SET LOCK MODE TO WAIT 5;回到默認(rèn)行為:SET LOCK MODE TO NOT WAIT;SET LOCK MODE 語句僅在會話級別有效。我們通過以下例子查看鎖模式的行為:清單 5. 開始會話dbaccess - -DROP DATABASE db1;CREATE DATABASE db1 WITH BUFFERED LOG;CREATE TABLE t1 (c1 int);INSERT INTO t1 VALUES (1);清單 6. 會話 Adbaccess db1 -BEGIN WORK;UPDATE t1 SET c1=5;清單 7. 會話 Bdbaccess db1 -SELECT* FROM t1;清單 8. 收到的錯誤244: Could not do a physical-order read to fetch next row.107: ISAM error: record is locked.清單 9. onstat -g sql 輸出$ onstat -g sqlIBM Informix Dynamic Server Version 11.50.FC4 - On-Line - Up 1 days 06:16:34 - 149504 KbytesSess SQL Current Iso Lock SQL ISAM F.E.Id Stmt type Database Lvl Mode ERR ERR Vers Explain30 - db1 CR Not Wait 0 0 9.24 Off輸出結(jié)果顯示 db1 的隔離級別為 “Committed Read”(后面將討論隔離級別)。因?yàn)楸?t1 上有一個(gè)未提交的更新,錯誤提示需要使用鎖定的記錄。 讓我們在會話 B 中嘗試使用 SET LOCK MODE WAIT 語句:SET LOCK MODE TO WAIT;SELECT* FROM t1;這個(gè)會話并沒有立即返回錯誤,而是等待鎖釋放。現(xiàn)在,在會話 A 中,完成事務(wù):COMMIT WORK;在會話 B 中,現(xiàn)在是等待提交結(jié)束之后才返回查詢結(jié)果。2、 死鎖當(dāng)兩個(gè)會話都持有它們需要使用的鎖時(shí)就會導(dǎo)致死鎖。結(jié)果是兩個(gè)會話都等待對方釋放鎖。不過,數(shù)據(jù)庫服務(wù)器可以檢測到這種情況并阻止它發(fā)生。例如:T1:讀取行 A 并在其上放置一個(gè)鎖。T2:讀取行 B 并在其上放置一個(gè)鎖。T1:在行 B 上請求一個(gè)鎖。T2:在行 A 上請求一個(gè)鎖。IDS 維護(hù)一個(gè)內(nèi)部鎖表。為了防止出現(xiàn)死鎖,IDS 將檢查內(nèi)部鎖表,查看在會話等待鎖期間是否會導(dǎo)致死鎖。發(fā)生的情況如下所示:T1:將鎖模式設(shè)置為等待。T2:將鎖模式設(shè)置為等待。T1:讀取行 A 并在其上放置一個(gè)鎖。T2:讀取行 B 并在其上放置一個(gè)鎖。T1:在行 B 上請求一個(gè)鎖;必須等待 T2 在行 B 上釋放該鎖。T2:在行 A 上請求一個(gè)鎖,但被拒絕了,因?yàn)榈却撴i的釋放會導(dǎo)致死鎖。IDS 從內(nèi)部鎖表檢測到: T1 持有行 A 上的鎖 T2 持有行 B 上的鎖 T1 等待 T2 持有的行 B 上的鎖 如果允許 T2 等待 T1 在行 A 上持有的鎖,那么將出現(xiàn)死鎖。因此,鎖請求被拒絕,并返回錯誤 (-143 ISAM error: deadlock detected)。檢查 onstat -p 的輸出看看是否有死鎖:清單 10. 檢查 onstat -p 輸出中的死鎖$ onstat -pIBM Informix Dynamic Server Version 11.50.FC4 - On-Line - Up 2 days 22:34:37 - 157696 KbytesProfiledskreads pagreads bufreads %cached dskwrits pagwrits bufwrits %cached13851 44301 1894394 99.27 22604 41159 429311 94.73isamtot open start read write rewrite delete commit rollbk1178884 64495 88313 413795 46723 58450 5657 17833 16gp_read gp_write gp_rewrt gp_del gp_alloc gp_free gp_curs0 0 0 0 0 0 0ovlock ovuserthread ovbuff usercpu syscpu numckpts flushes0 0 0 89.23 13.32 366 70849bufwaits lokwaits lockreqs deadlks dltouts ckpwaits compress seqscans191 0 750183 5 0 6 4010 6770ixda-RA idx-RA da-RA RA-pgsused lchwaits231 2 3080 3313 254查看 “deadlks” 字段,您可以看到在數(shù)據(jù)庫服務(wù)器上線至今發(fā)生了 5 個(gè)死鎖事件。如果頻繁發(fā)生死鎖,請檢查應(yīng)用程序并交錯使用頻繁更改的行。通過減少鎖等待時(shí)間可以降低出現(xiàn)死鎖的幾率。對于分布式事務(wù),會話在返回錯誤之前使用 DEADLOCK_TIMEOUT 配置參數(shù)等待來自遠(yuǎn)程數(shù)據(jù)庫的響應(yīng)。在 onstat -p 輸出中的 “dlouts” 字段顯示分布式死鎖超時(shí)的統(tǒng)計(jì)數(shù)據(jù)。日志和非日志數(shù)據(jù)庫在日志數(shù)據(jù)庫中,數(shù)據(jù)庫服務(wù)器記錄其事務(wù)以及在事務(wù)期間持有的鎖。一般都能夠識別到事務(wù)持有的鎖,除非事務(wù)沒有提交或被回滾。非日志數(shù)據(jù)庫中沒有事務(wù),但仍然使用鎖。盡管很容易錯過,但是服務(wù)器在執(zhí)行 Data Manipulation Language 時(shí)使用鎖,并且在該語句完成之后快速釋放鎖。3、 監(jiān)控鎖onstat 實(shí)用程序監(jiān)控鎖數(shù)據(jù)庫服務(wù)器使用的鎖保持在一個(gè)內(nèi)部鎖表中。使用 onstat -k 命令可以監(jiān)控?cái)?shù)據(jù)庫服務(wù)器持有的鎖的類型和粒度。onstat -k 命令的輸出包含以下字段:表 2. onstat -k 命令輸出包含的字段字段說明address鎖表中的鎖的位置。如果用戶線程正在等待這個(gè)鎖,那么該鎖的地址就會出現(xiàn)在 onstat -u(用戶)輸出的 wait 字段中。wtlist等待鎖的用戶線程列表的第一項(xiàng),如果存在的話。owner持有鎖的線程的共享內(nèi)存地址。這個(gè)地址與 onstat -u(用戶)輸出中的 address 字段中的地址對應(yīng)。當(dāng)持有者值顯示在圓括號中時(shí),它表示事務(wù)結(jié)構(gòu)的共享內(nèi)存地址。僅當(dāng)為全局事務(wù)分配鎖時(shí)才會發(fā)生這種情況。這個(gè)地址與 onstat -G 輸出的 address 字段對應(yīng)。lklist剛才列出的持有者持有的鏈接鎖列表中的下一個(gè)鎖。type使用以下符號表示鎖的類型: HDR - 頭部 B - 字節(jié) S - 共享 X - 獨(dú)占 I - 意向 U - 更新 IX - 意向獨(dú)占 IS - 意向共享 SIX - 共享意向獨(dú)占 tblsnum行標(biāo)識號碼。rowid 提供以下鎖信息: 如果 rowid 為 0,那么這個(gè)鎖是一個(gè)表鎖。 如果 rowid 以兩個(gè) 0 結(jié)尾,那么這個(gè)鎖是一個(gè)頁鎖。 如果 rowid 小于等于 6 位數(shù)并且不以 0 結(jié)尾,那么這個(gè)鎖可能是一個(gè)行鎖。 如果 rowid 大于 6 位數(shù),那么該鎖可能是一個(gè)索引鍵-值鎖。 key#/bsiz索引鍵值號,或?yàn)?VARCHAR 鎖鎖定的字節(jié)數(shù)。如果這個(gè)字段包含 “K-” 并且其后接一個(gè)值,那么這是一個(gè)鍵鎖。該值標(biāo)識要鎖住的索引。例如,K-1 表示為表定義的第一個(gè)索引包含一個(gè)鎖?;仨撌護(hù)nstat -k 命令的示例輸出這個(gè)例子使用不遵從 ANSI 的日志數(shù)據(jù)庫和兩個(gè)表:CREATE DATABASE db1 WITH LOG;CREATE TABLE t1 (c1 int);CREATE TABLE t2 (c1 int) LOCK MODE ROW;以下值被插入到這兩個(gè)表中:INSERT INTO t1 VALUES (1);INSERT INTO t2 VALUES (1);INSERT INTO t2 VALUES (2);執(zhí)行以下語句:BEGIN WORK;UPDATE t1 SET c1=5;UPDATE t2 SET c1=5;onstat -k 的輸出:清單 11. onstat -k 的輸出$ onstat -kIBM Informix Dynamic Server Version 11.50.FC4 - On-Line - Up 2 days 21:39:44 - 157696 KbytesLocksaddress wtlist owner lklist type tblsnum rowid key#/bsiz10a3134d8 0 111535cd8 0 HDR+S 100002 204 010a44bcd8 0 111535488 0 S 100002 204 010a44bd58 0 111536528 0 S 100002 204 010a44c4d8 0 111537e18 0 HDR+S 100002 202 011348b028 0 111537e18 10a44c4d8 HDR+IX 1001ef 0 011348b0a8 0 111537e18 11348b028 HDR+X 1001ef 100 011348b128 0 111537e18 11348b0a8 HDR+IX 1001f0 0 011348b2a8 0 111537e18 11348b128 HDR+X 1001f0 101 0 U11348b328 0 111537e18 11348b2a8 HDR+X 1001f0 102 0 U 9 active, 80000 total, 16384 hash buckets, 2 lock table overflows該輸出包含以下信息: 表鎖: o 查看地址為 11348b028 的行,其 rowid 為 0,表明這個(gè)鎖是表鎖。IX 表明其類型為意向獨(dú)占。 頁鎖: o 查看地址為 11348b0a8 的行,其 rowid 的最后兩位為 00,表明這個(gè)鎖是頁鎖。類型 X 表明它是獨(dú)占鎖。這是針對 t1 的,它使用頁級鎖模式。 行鎖: o 查看地址為 11348b328 的行,其 rowid 為 0x102,表明這個(gè)鎖是行鎖,在這里為獨(dú)占鎖。這是針對 t2 的,它使用行級鎖模式。 數(shù)據(jù)庫鎖: o 查看地址為 10a3134d8 的行,表上有一個(gè)行鎖。不過,tblsnum 0x100002 是一個(gè)數(shù)據(jù)庫 tblspace,它是在服務(wù)器中保持?jǐn)?shù)據(jù)庫列表的特殊表。因此,它行上的鎖相當(dāng)于鎖定數(shù)據(jù)庫。類型 S 表明該鎖是一個(gè)共享鎖。 要在 onstat -k, 中找出 tblsnum 的表名,需要對 systables 表使用以下語句:清單 12. 識別 tbslnum 的表名SELECT * FROM systables WHERE partnum=1049072;Output:tabname t2owner informixpartnum 1049072tabid 101rowsize 4ncols 1nindexes 0nrows 0.00created 07/20/2009version 6619137tabtype Tlocklevel Rnpused 0.00fextsize 16nextsize 16flags 0sitedbnametype_xid 0am_id 0pagesize 2048ustlowtssecpolicyid 0protgran

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論