萬(wàn) 勵(lì),吳潔明,莫智懿
WAN Li, WU Jie-ming, MO Zhi-yi
(梧州學(xué)院 計(jì)算機(jī)科學(xué)系,梧州 543002)
基于B/S模式的公文流轉(zhuǎn)系統(tǒng)互斥訪問(wèn)控制策略研究
Research on mutual exclusion access control in document transmission system based on B/S model
萬(wàn) 勵(lì),吳潔明,莫智懿
WAN Li, WU Jie-ming, MO Zhi-yi
(梧州學(xué)院 計(jì)算機(jī)科學(xué)系,梧州 543002)
針對(duì)B/S模式的公文流轉(zhuǎn)系統(tǒng)中多人同時(shí)處理公文時(shí)經(jīng)常出現(xiàn)數(shù)據(jù)不一致性以及死鎖的問(wèn)題,通過(guò)對(duì)B/S模式中的application對(duì)象和session對(duì)象的相關(guān)特性深入研究,結(jié)合鎖的控制機(jī)制,找出了解決問(wèn)題的方法,不僅實(shí)現(xiàn)了公文互斥訪問(wèn),而且在實(shí)現(xiàn)過(guò)程中無(wú)需額外訪問(wèn)和修改數(shù)據(jù)庫(kù),使得訪問(wèn)過(guò)程不出現(xiàn)死鎖,對(duì)服務(wù)器訪問(wèn)代價(jià)也較小,因而在大型辦公自動(dòng)化系統(tǒng)中有現(xiàn)實(shí)意義。
互斥訪問(wèn);公文流轉(zhuǎn);B/S;application;session
公文流轉(zhuǎn)[1]作為辦公自動(dòng)化系統(tǒng)的重要組成部分,涉及到多個(gè)部門、多個(gè)用戶的協(xié)同處理,常出現(xiàn)多人同時(shí)處理同一公文。如果對(duì)公文不進(jìn)行互斥訪問(wèn),則容易出現(xiàn)以下問(wèn)題[2]:1)當(dāng)某一用戶選中的公文正在更新時(shí),其他用戶也可能要讀取該公文,此時(shí)讀取的是臟數(shù)據(jù);2)當(dāng)有兩個(gè)或兩個(gè)以上的用戶選中同一個(gè)公文,并基于最初選定的值更新時(shí),由于用戶間不知道其他用戶的存在,最后的更新將重寫由其他用戶所做的更新,將發(fā)生丟失更新問(wèn)題。在B/S模式的公文處理系統(tǒng)中,由于用戶處于網(wǎng)絡(luò)環(huán)境中,網(wǎng)絡(luò)的不穩(wěn)定性也容易造成死鎖等問(wèn)題。
在處理多用戶訪問(wèn)公文的互斥問(wèn)題中,常規(guī)的數(shù)據(jù)庫(kù)字段解決方法是在公文數(shù)據(jù)表中增加一個(gè)bit型的字段,作為該公文是否正在被處理的標(biāo)志。當(dāng)該公文沒(méi)有被任何人訪問(wèn)的時(shí)候字段的值為0。當(dāng)有人要訪問(wèn)的時(shí)候,先查詢出該字段的值,如果為0則更新為1,進(jìn)入公文處理頁(yè)面;如果該字段為1則表示某用戶正在處理該公文,當(dāng)前用戶不能進(jìn)入。當(dāng)進(jìn)入的用戶處理完公文退出時(shí)就將該字段設(shè)置為0,這樣實(shí)現(xiàn)了對(duì)公文的互斥訪問(wèn)。但是,這個(gè)過(guò)程中如果出現(xiàn)意外,字段解決方法將帶來(lái)嚴(yán)重的問(wèn)題。
基于B/S模式的系統(tǒng)中,由于程序的執(zhí)行是通過(guò)瀏覽器解釋程序,把解釋的結(jié)果返回客戶端,因此,在頁(yè)面定義的腳本級(jí)變量,其作用范圍是本頁(yè)面,各頁(yè)面間的變量不能相互調(diào)用。如果要實(shí)現(xiàn)定義的變量在整個(gè)應(yīng)用程序中都能被訪問(wèn),就必須使用應(yīng)用程序級(jí)變量:application對(duì)象或者session對(duì)象。本文利用這兩個(gè)對(duì)象來(lái)實(shí)現(xiàn)公文的互斥訪問(wèn)控制。
application對(duì)象定義的變量,所有用戶都能訪問(wèn)和修改其數(shù)據(jù),訪問(wèn)時(shí)需要實(shí)現(xiàn)互斥訪問(wèn),其作用周期是服務(wù)器運(yùn)行期間永久保存。利用application對(duì)象定義變量及其訪問(wèn)方法如下:
session對(duì)象定義的變量,其作用周期是從用戶進(jìn)入系統(tǒng)開始到離開系統(tǒng),同時(shí)程序員可自定義該對(duì)象的作用時(shí)間。每個(gè)用戶都有一個(gè)自己的session對(duì)象,用戶自己能訪問(wèn)自己的session對(duì)象定義的變量數(shù)據(jù),但用戶相互之間不能互相訪問(wèn),互不干擾。利用session對(duì)象定義變量及其訪問(wèn)方法如下:
在用戶登錄時(shí),系統(tǒng)利用session對(duì)象記錄當(dāng)前用戶的用戶名。
在B/S模式的公文流轉(zhuǎn)系統(tǒng)中,每個(gè)公文都有與之對(duì)應(yīng)的唯一公文編號(hào)作為標(biāo)識(shí),公文編號(hào)用字母和數(shù)字組成,可用隨機(jī)字母+日期(精確到秒)+隨機(jī)數(shù)的方式實(shí)現(xiàn)。
獲得當(dāng)前公文的公文編號(hào)后,用腳本級(jí)變量document_NO記錄當(dāng)前公文編號(hào),對(duì)公文互斥訪問(wèn)時(shí),利用公文的公文編號(hào)作application對(duì)象定義的變量使用,即每個(gè)公文對(duì)應(yīng)著一個(gè)application對(duì)象所定義的變量,并能使所有用戶訪問(wèn)。
在此定義application對(duì)象所定義的變量時(shí)關(guān)鍵在于用一個(gè)變量替代application對(duì)象定義的變量名稱,區(qū)別于application("document_NO"), application("document_NO")定義的是一個(gè)變量名為document_NO的全局變量,而application(document_NO)定義的是以document_NO變量的值即某公文編號(hào)為變量的application對(duì)象的變量名稱。
利用鎖的并發(fā)控制機(jī)制[3],可實(shí)現(xiàn)對(duì)公文的互斥訪問(wèn)。對(duì)任何公文的操作必須先申請(qǐng)?jiān)摴牡逆i,只有加鎖成功后才可對(duì)公文進(jìn)行操作。操作完成后,釋放所申請(qǐng)的鎖。如果需申請(qǐng)的鎖已被其它用戶鎖定則必須等待,直到那個(gè)用戶釋放該公文的鎖為止。具體實(shí)現(xiàn)公文的互斥訪問(wèn)過(guò)程如下:
1)根據(jù)當(dāng)前用戶的崗位以及權(quán)限從數(shù)據(jù)庫(kù)中查詢出未處理公文的基本信息,并給每條記錄設(shè)置進(jìn)入該公文處理頁(yè)面的鏈接入口。定義該頁(yè)面文件為showmsg.asp。
2)用戶選擇公文進(jìn)入公文處理頁(yè)面deal_document.asp,在進(jìn)入公文處理頁(yè)面之前,先判斷application(document_NO)變量值是否為空,若為空表示沒(méi)有人正在處理該公文;若值為當(dāng)前用戶名,表示當(dāng)前用戶曾經(jīng)因意外原因離開處理公文頁(yè)面,則當(dāng)前用戶可以進(jìn)入并處理該公文,同時(shí)把自己的用戶名賦值給application(document_NO)。此時(shí),如果其他用戶想進(jìn)入處理該公文,因?yàn)閍pplication(document_NO)不為空而強(qiáng)制轉(zhuǎn)向showmsg.asp,提示用戶該公文正在被其他人處理。
當(dāng)公文正被其他人處理時(shí),應(yīng)提示用戶是誰(shuí)正在處理該公文。由于application(document_NO)記錄了正在處理公文的用戶名,所有用戶都能訪問(wèn)到application對(duì)象,通過(guò)訪問(wèn)該對(duì)象則可實(shí)現(xiàn)用戶提示。application(document_NO)為空時(shí)或等于當(dāng)前用戶名,表示當(dāng)前該公文沒(méi)有人在辦理或當(dāng)前用戶曾非正常離開此公文處理頁(yè)面,則提供進(jìn)入處理該公文的鏈接;否則表示該公文現(xiàn)正有人處理,當(dāng)前用戶不能進(jìn)入處理公文,不提供鏈接并提示用戶application(document_NO)正在處理。
公文解鎖時(shí)效控制特別重要,如果不能處理好解除公文鎖定問(wèn)題,則公文將會(huì)進(jìn)入死鎖狀態(tài),任何用戶無(wú)法對(duì)該公文進(jìn)行訪問(wèn)。用戶解除對(duì)公文的鎖定有如下幾個(gè)時(shí)效:
1)當(dāng)前用戶完成對(duì)公文處理,并提交給下一崗位;
2)當(dāng)前用戶選擇正常退出系統(tǒng)(無(wú)論當(dāng)前用戶是否正在處理公文還是沒(méi)有處理公文時(shí)退出系統(tǒng));
3)當(dāng)前用戶關(guān)閉瀏覽器;
4)當(dāng)前用戶超時(shí);
5)當(dāng)前用戶回到showmsg.asp選擇其他公文(無(wú)論當(dāng)前用戶是否在處理公文情況);
6)系統(tǒng)突然斷電。
session("treatment")這個(gè)變量記錄的是當(dāng)前用戶鎖定的公文編號(hào),如果該用戶沒(méi)有鎖定任何公文,則session("treatment")為空。對(duì)于系統(tǒng)中的某一用戶來(lái)說(shuō)Application(session("treat ment"))與application(document_NO)等價(jià),因?yàn)閟ession("treatment")保存的是公文編號(hào),具體指代當(dāng)前用戶鎖定的公文編號(hào)。對(duì)于情況1)至5),先判斷session("treatment")是否為空,若為空,則執(zhí)行Application(session("treatment"))=""語(yǔ)句,解除對(duì)該公文的鎖定。
代碼放置的位置如下:情況1)代碼應(yīng)放置于當(dāng)前用戶完成對(duì)公文處理,退出公文處理頁(yè)面。情況2)至4)可以把代碼放入到global.asa文件中定義的session_onend事件里面,因?yàn)檫@個(gè)事件是當(dāng)用戶退出系統(tǒng)時(shí)自動(dòng)執(zhí)行的,所以當(dāng)發(fā)生以上三種情況時(shí)都會(huì)執(zhí)行這段代碼。情況5)則將代碼放在showmsg.asp頁(yè)面的最前面。
對(duì)于情況6),客戶端突然斷電,此時(shí)如果某用戶正在處理某公文,由于用戶已經(jīng)鎖定該公文,而application對(duì)象所定義的變量是保存在服務(wù)器端的,斷電時(shí)application(document_NO)不會(huì)自動(dòng)清空,也就無(wú)法解除對(duì)公文的鎖定,則其他用戶以及此用戶再度進(jìn)入系統(tǒng)也不能辦理。解決的方法是在該用戶重新登陸進(jìn)入系統(tǒng)并查詢未辦理公文,執(zhí)行showmsg.asp時(shí)加入以下代碼:
在基于B/S的公文流轉(zhuǎn)系統(tǒng)中,本文所研究的方法,通過(guò)應(yīng)用程序級(jí)對(duì)象application和session相結(jié)合,并利用這兩個(gè)對(duì)象訪問(wèn)特性差異實(shí)現(xiàn)了對(duì)公文的實(shí)時(shí)互斥訪問(wèn),實(shí)現(xiàn)過(guò)程不需要在數(shù)據(jù)庫(kù)的數(shù)據(jù)表中增加互斥訪問(wèn)字段,不需要額外訪問(wèn)數(shù)據(jù)庫(kù),使實(shí)現(xiàn)過(guò)程對(duì)服務(wù)器的訪問(wèn)代價(jià)較小。
[1] 丁寧.基于工作流模型的OA系統(tǒng)[J].計(jì)算機(jī)與數(shù)字工程,2008,36(7):90-94.
[2] 陳俊伽,王韜.關(guān)系數(shù)據(jù)庫(kù)并發(fā)控制機(jī)制的研究[J].科學(xué)技術(shù)與工程, 2007,7(18):4635-4637.
[3] 趙慧玲,劉美榮.SQL數(shù)據(jù)庫(kù)中并發(fā)控制的研究[J].長(zhǎng)春工程學(xué)院學(xué)報(bào):自然科學(xué)版,2009,10(2):78-81.
TP311
A
1009-0134(2010)11(下)-0205-03
10.3969/j.issn.1009-0134.2010.11(下).69
2010-09-29
廣西科學(xué)研究與技術(shù)開發(fā)計(jì)劃項(xiàng)目(0815003-4)
萬(wàn)勵(lì) (1972 -),女,廣西平南人,講師,碩士,研究方向?yàn)閿?shù)據(jù)庫(kù)應(yīng)用。