• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    Melinets圖書(shū)管理系統(tǒng)死鎖問(wèn)題研究

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

    王德山

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

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

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

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

    一、Sybase鎖的類(lèi)型及作用

    (一)共享鎖(Share Lock)

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

    (二)排他鎖(Exclusive Lock)

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

    (三)更新鎖(Update Lock)

    一般更新模式由一個(gè)事務(wù)組成,此事務(wù)讀取記錄,獲取資源(頁(yè)或行)的共享鎖,然后修改行,此操作要求鎖轉(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ù)彼此等待對(duì)方釋放共享模式鎖的情形,從而發(fā)生死鎖。要避免這種潛在的死鎖問(wèn)題,就要使用更新鎖.一次只有一個(gè)事務(wù)可以獲得資源的更新鎖。如果事務(wù)修改資源,則更新鎖轉(zhuǎn)換為排他鎖,否則轉(zhuǎn)換為共享鎖。Sybase在Update,Delete或Fetch的初始階段加Update鎖。如果頁(yè)面或者行的內(nèi)容需要修改,只要沒(méi)有其他Share鎖在上面,Update鎖立即升級(jí)為Exclusive鎖。

    (四)意向鎖(Intent Lock)

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

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

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

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

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

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

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

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

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

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

    Sp_config 'read committed with lock',0|1

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

    Sp_chgattribute,”concurrency_opt_threshold”,

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

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

    三、死鎖的解除

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

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

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

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

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

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

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

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

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

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

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

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

    四、結(jié)語(yǔ)

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

    參考文獻(xiàn):

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

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

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

    灵武市| 石河子市| 福鼎市| 绥芬河市| 麻阳| 察雅县| 金华市| 化隆| 儋州市| 沐川县| 龙泉市| 白沙| 团风县| 尚志市| 南宫市| 华宁县| 龙南县| 手游| 来宾市| 衡山县| 镶黄旗| 永平县| 石狮市| 墨江| 清河县| 武冈市| 大丰市| 当雄县| 定远县| 广安市| 绥滨县| 周口市| 嘉峪关市| 乌兰浩特市| 普兰县| 融水| 万载县| 湘潭县| 西昌市| 玛曲县| 安吉县|