国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Melinets圖書管理系統(tǒng)死鎖問題研究

2009-07-16 09:33王德山
新媒體研究 2009年8期

王德山

[摘要]不同的數(shù)據(jù)庫管理系統(tǒng)提供的封鎖類型、封鎖協(xié)議、達(dá)到的系統(tǒng)一致性級別不盡相同,但其依據(jù)的基本原理和技術(shù)是共同的。通過對melinets圖書管理系統(tǒng)死鎖問題的研究,分析了SYBASE數(shù)據(jù)庫鎖的機(jī)制,提出了預(yù)防死鎖的幾種措施,并給出了解除死鎖的相關(guān)方法。

[關(guān)鍵詞]melinets sybase 死鎖

中圖分類號:TP3文獻(xiàn)標(biāo)識(shí)碼:A文章編號:1671-7597(2009)0420041-02

Melinets是北京郵電大學(xué)開發(fā)的一種集采訪、編目、流通、期刊等子系統(tǒng)在內(nèi)的圖書館自動(dòng)化管理系統(tǒng),其后臺(tái)采用SYBASE數(shù)據(jù)庫。它通過鎖的方式保護(hù)被活動(dòng)的事務(wù)正在使用的表、數(shù)據(jù)頁或者數(shù)據(jù)行。加鎖是實(shí)現(xiàn)數(shù)據(jù)庫并發(fā)控制的一個(gè)非常重要的技術(shù)。當(dāng)事務(wù)在對某個(gè)數(shù)據(jù)對象進(jìn)行操作前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務(wù)就對該數(shù)據(jù)對象有了一定的控制,在該事務(wù)釋放鎖之前,其他的事務(wù)不能對此數(shù)據(jù)對象進(jìn)行更新操作。確切的控制由鎖的類型來決定。原鄭州經(jīng)濟(jì)管理干部學(xué)院(現(xiàn)河南工程學(xué)院)于2003年至2008年10月一直使用該圖書管理系統(tǒng),在對圖書進(jìn)行數(shù)據(jù)加工,書目數(shù)據(jù)發(fā)送等過程中,經(jīng)常出現(xiàn)進(jìn)程阻塞甚至死鎖的現(xiàn)象。本文從SYBASE數(shù)據(jù)庫死鎖的原理出發(fā),結(jié)合melinets死鎖發(fā)生的具體情況,提出了在應(yīng)用melinets過程中預(yù)防和處理死鎖的相關(guān)措施。

一、Sybase鎖的類型及作用

(一)共享鎖(Share Lock)

共享(S)鎖允許并發(fā)事務(wù)讀?。⊿elect)一個(gè)資源。資源上存在共享鎖時(shí),任何其他事務(wù)都不能修改數(shù)據(jù)。Sybase對讀操作加Share鎖。如果一個(gè)S鎖已經(jīng)加在一個(gè)表、數(shù)據(jù)頁、數(shù)據(jù)行或索引頁上,即使加鎖的事務(wù)是活動(dòng)的,其他事務(wù)仍然可以獲得S鎖。但在表或數(shù)據(jù)頁或數(shù)據(jù)行上的所有S鎖被釋放前,其他事務(wù)都不能獲得該表或頁面或行的exclusive鎖。這就意味著多個(gè)事務(wù)可以同時(shí)讀表、頁面或行,但沒有事務(wù)能對已經(jīng)加S鎖的表、頁面或行中的數(shù)據(jù)進(jìn)行修改,而必須等待S鎖釋放后才能繼續(xù)。

(二)排他鎖(Exclusive Lock)

排他(X)鎖是為修改數(shù)據(jù)而保留的,可以防止并發(fā)事務(wù)對資源進(jìn)行訪問。排他鎖與其他鎖不兼容。Sybase對數(shù)據(jù)更改操作加Exclusive鎖。如果一個(gè)事務(wù)獲得了一個(gè)Exclusive鎖,那么在這個(gè)事物結(jié)束時(shí)釋放Exclusive鎖之前,其他事務(wù)在相應(yīng)的表或頁面或行上不能獲得任何類型的鎖。其他事務(wù)必須等到Exclusive鎖釋放后才能繼續(xù)。

(三)更新鎖(Update Lock)

一般更新模式由一個(gè)事務(wù)組成,此事務(wù)讀取記錄,獲取資源(頁或行)的共享鎖,然后修改行,此操作要求鎖轉(zhuǎn)換為排他鎖。如果兩個(gè)事務(wù)獲得了資源上的共享模式鎖,并試圖同時(shí)更新數(shù)據(jù),則其中一個(gè)事務(wù)會(huì)嘗試將鎖轉(zhuǎn)換為排他鎖。因?yàn)橐粋€(gè)事務(wù)的排他鎖與其他事務(wù)的共享模式鎖不兼容,所以從共享模式到排他鎖的轉(zhuǎn)換必須等待一段時(shí)間。而此時(shí),第2個(gè)事務(wù)也試圖獲取排他鎖以進(jìn)行更新,于是就出現(xiàn)同時(shí)持有共享模式鎖的兩個(gè)事務(wù)彼此等待對方釋放共享模式鎖的情形,從而發(fā)生死鎖。要避免這種潛在的死鎖問題,就要使用更新鎖.一次只有一個(gè)事務(wù)可以獲得資源的更新鎖。如果事務(wù)修改資源,則更新鎖轉(zhuǎn)換為排他鎖,否則轉(zhuǎn)換為共享鎖。Sybase在Update,Delete或Fetch的初始階段加Update鎖。如果頁面或者行的內(nèi)容需要修改,只要沒有其他Share鎖在上面,Update鎖立即升級為Exclusive鎖。

(四)意向鎖(Intent Lock)

意向(I)鎖指出在一個(gè)表上有頁級或行級鎖。Sybase對每一個(gè)有Share或Exclusive的頁或行鎖的表加意向鎖。所以意向鎖可以是Exclusive

鎖,也可以是Share鎖。設(shè)置意向鎖可以防止其他后來的事務(wù)在有鎖住的頁的表上獲得沖突的表級鎖。意向鎖持續(xù)的時(shí)間和事務(wù)中頁或行鎖的時(shí)間一樣長。

二、melinets死鎖的產(chǎn)生與預(yù)防

一般來說,如果事務(wù)T1封鎖了數(shù)據(jù)R1,T2封鎖了R2,然后TI又請求封鎖R2,因?yàn)镽2已經(jīng)被T2封鎖,于是TI等待T2釋放R2,上的鎖。接著T2又申請封鎖R1,因?yàn)門I已經(jīng)封鎖了R1,于是T2也只能等待T1釋放R1上的鎖。這樣一來,就出現(xiàn)了T1封鎖R1同時(shí)等待R2,T2封鎖R2同時(shí)等待R1。于是T1,T2兩個(gè)事務(wù)永遠(yuǎn)不能完成,就形成死鎖。

例如在應(yīng)用melinets集中進(jìn)行數(shù)據(jù)批量發(fā)送過程中,經(jīng)常容易引起死鎖。melinets數(shù)據(jù)發(fā)送過程實(shí)際就是將已編目好的書目表數(shù)據(jù)向流通典藏表更新的過程,批量發(fā)送就相當(dāng)于批量更新。尤其是在同一時(shí)間段進(jìn)行批量發(fā)送的用戶越多,這時(shí)就更容易造成用戶之間對表鎖和數(shù)據(jù)頁鎖的爭用,從而加大了死鎖的發(fā)生。

死鎖的頻繁發(fā)生將極大影響工作的效率,甚至可能對系統(tǒng)造成無法挽回的損失,因此我們應(yīng)盡量預(yù)防發(fā)生死鎖。防止死鎖的發(fā)生其實(shí)就是破壞死鎖的條件。理論上預(yù)防死鎖有兩種方法:

1.一次封鎖法。一次封鎖法,要求每個(gè)事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,否則就不能繼續(xù)執(zhí)行。顯然一次封鎖法可以有效的防止死鎖的發(fā)生,但由于一次將以后要用到的全部數(shù)據(jù)加鎖,擴(kuò)大的封鎖的范圍,也就降低了系統(tǒng)的并發(fā)度。

2.順序封鎖法。順序封鎖法是預(yù)先對數(shù)據(jù)對象規(guī)定一個(gè)封鎖順序,所有事務(wù)都按這個(gè)順序?qū)嵭蟹怄i。順序封鎖法也可以有效的防止死鎖,但它同樣存在問題。由于數(shù)據(jù)庫中封鎖的對象多,而且事務(wù)的封鎖請求可以隨著事務(wù)的執(zhí)行而動(dòng)態(tài)的決定,因此要維持這樣的封鎖順序不但成本很高,而且很難實(shí)現(xiàn)。

針對melinets實(shí)際應(yīng)用過程中,我們可以通過合理調(diào)度不同任務(wù)的執(zhí)行順序和時(shí)間,避免資源過多占用,這樣也可以有效的預(yù)防死鎖的發(fā)生。例如:在進(jìn)行批量發(fā)送時(shí),分批次分時(shí)間段進(jìn)行。同時(shí)利用系統(tǒng)過程對數(shù)據(jù)庫相關(guān)參數(shù)進(jìn)行合理設(shè)置:

(1)帶有加鎖方式的讀提交設(shè)置,通過改變釋放共享鎖的時(shí)間點(diǎn)來減少死鎖的發(fā)生,命令如下:

Sp_config 'read committed with lock',0|1

(2)在考慮掃描一張表之前,需要確定在一張表中能有多少頁,采用如下命令在頁級結(jié)構(gòu)中加以配置:

Sp_chgattribute,”concurrency_opt_threshold”,

(3)適當(dāng)設(shè)置臨時(shí)表空間大小,避免臨時(shí)表空間被占滿而發(fā)生阻塞。

另外,數(shù)據(jù)庫死鎖還與系統(tǒng)綜合性能有關(guān)。如系統(tǒng)I/O通常是影響系統(tǒng)性能的瓶頸。如果能提高I/O性能,事務(wù)執(zhí)行時(shí)間相對縮短,從而鎖爭用和死鎖的可能性就隨之減少。

三、死鎖的解除

在事務(wù)和鎖的使用過程中,死鎖是一個(gè)不可避免的現(xiàn)象。當(dāng)死鎖發(fā)生時(shí),我們應(yīng)盡快查找死鎖的原因并解除死鎖。通常,當(dāng)系統(tǒng)檢測到死鎖發(fā)生時(shí),采用的方法是:選擇一個(gè)處理死鎖代價(jià)最小的事務(wù),將其撤消,釋放此事務(wù)持有的所有的鎖,使其他事務(wù)得以繼續(xù)下去。當(dāng)然對撤消的事務(wù)所執(zhí)行的數(shù)據(jù)修改操作必須加以恢復(fù)。針對melinets圖書管理系統(tǒng)具體方法如下:

1.死鎖發(fā)生時(shí)用系統(tǒng)進(jìn)程SP_WHO查看系統(tǒng)進(jìn)程信息。

SP_WHO返回結(jié)果如圖(1),結(jié)果解釋如下:

Fid進(jìn)程所屬的組

Spid 進(jìn)程號

Status進(jìn)程狀態(tài)

Loginname啟動(dòng)進(jìn)程的用戶登錄名

Blk阻塞進(jìn)程的ID

Dbname該進(jìn)程訪問的數(shù)據(jù)庫

Cmd 該進(jìn)程執(zhí)行的命令和進(jìn)程

如果用戶進(jìn)程正被另一用戶進(jìn)程阻塞,則status列顯示“l(fā)ock sleep”,而blk列顯示保持該鎖或這些鎖的進(jìn)程標(biāo)識(shí),即被誰鎖定。Loginname列顯示登錄操作員。這樣結(jié)合相應(yīng)的操作員信息表,便可知道操作員是誰。

2.用SP_LOCK獲得當(dāng)前狀態(tài)中鎖的分配和使用情況。

通過SP_LOCK命令可以查看系統(tǒng)被鎖數(shù)據(jù)表的情況,包括數(shù)據(jù)表的ID號。被鎖的類型(前綴sh為共享鎖,ex為排它鎖,后綴blk表明該進(jìn)程正在阻礙另一個(gè)需要請求鎖的進(jìn)程)以及數(shù)據(jù)庫名稱dbname。

3.結(jié)合二者結(jié)果與庫表SYSOBJECTS查出被鎖定的庫表以及鎖住別人的操作員。

4.詢問相關(guān)操作員并撤消相關(guān)事務(wù),從而達(dá)到解除死鎖的目的。

當(dāng)然,當(dāng)死鎖發(fā)生時(shí),重新啟動(dòng)melinets數(shù)據(jù)庫服務(wù)器也可以達(dá)到解除死鎖的目的,但這是個(gè)笨方法,因?yàn)檫@樣既無法保證數(shù)據(jù)的完整性,也耗費(fèi)資源。因此作為數(shù)據(jù)庫DBA而言不到萬不得以不應(yīng)該采用重啟的方式。

四、結(jié)語

死鎖是任何數(shù)據(jù)庫系統(tǒng)都無法避免的一種現(xiàn)象,頻繁的死鎖將為我們的工作帶來很大的不便,甚至是無法估計(jì)的損失。因此我們應(yīng)該盡量減少死鎖的發(fā)生。而一旦死鎖發(fā)生時(shí),應(yīng)該積極采取有效的應(yīng)對措施來解決死鎖。melinets作為一款現(xiàn)代信息集成圖書管理系統(tǒng),在使用過程中或多或少由于SYBASE數(shù)據(jù)庫的特性,或者一些其他的人為因素也可能會(huì)發(fā)生死鎖,但只要我們了解死鎖的原理,再根據(jù)實(shí)際情況,通過合理的調(diào)度,就可以盡量減少由于死鎖而為我們帶來的麻煩。

參考文獻(xiàn):

[1]薩師宣、王珊,數(shù)據(jù)庫系統(tǒng)概論[M].第三版,高等教育出版社,2004.

[2]SYBASE,數(shù)據(jù)庫維護(hù)參考手冊,Version2.0.

[3]連宇江、唐穎,Melinets圖書管理系統(tǒng)的管理和維護(hù)點(diǎn)淺談[J].科技文獻(xiàn)信息管理,2005.1.