王 攀,陳少平,谷 濤,何光源
(1.華中科技大學(xué) 生命科學(xué)與技術(shù)學(xué)院 科技部基因工程國際合作基地 教育部分子生物物理重點實驗室,湖北 武漢 430074;2.中南民族大學(xué) 電子信息工程學(xué)院,湖北 武漢 430074)
隨著各種網(wǎng)絡(luò)技術(shù)、數(shù)據(jù)庫技術(shù)的日益成熟和普及,依托校園網(wǎng)開發(fā)基于Web的管理信息系統(tǒng),使相關(guān)的人力、物力、財力得到很好的管理和運作,已經(jīng)成為國內(nèi)各高校本科教學(xué)管理的發(fā)展方向[1-3]。本文討論的畢業(yè)論文選題系統(tǒng)正是在這一背景下提出的。它構(gòu)建于Internet之上,集中管理本科畢業(yè)論文選題過程中學(xué)生和教師之間的雙向選擇。
在傳統(tǒng)的畢業(yè)論文雙向選題中,學(xué)生對教師發(fā)布論文題目的選擇和教師對學(xué)生的選擇一般依次、輪流地進行。首先,學(xué)生預(yù)選自己感興趣的論文題目,然后,教師確定是否對該學(xué)生進行正選。如果一輪過后仍有學(xué)生未被正選,則將進入下一輪。這種選擇方式的師生互動性較弱,很容易出現(xiàn)某一教師的題目被選過多,而某一學(xué)生幾輪過后仍然未被正選的情況。
為了改變上述狀況,畢業(yè)論文選題系統(tǒng)的開發(fā)必須注重信息的并發(fā)控制,實現(xiàn)師生雙向選擇的并發(fā)進行和相互制約。首先規(guī)定基本選題原則:
(1)一個教師可以發(fā)布多個題目,一個題目可由多個學(xué)生參與;
(2)學(xué)生可以預(yù)選多個題目(教務(wù)管理員設(shè)置學(xué)生可預(yù)選題目數(shù)量的上限),已預(yù)選的題目也可以退選;
(3)教師可以正選多個預(yù)選了本人發(fā)布題目的學(xué)生(教務(wù)管理員設(shè)置教師可正選學(xué)生總?cè)藬?shù)的上限);
(4)題目相應(yīng)的正選學(xué)生人數(shù)不能超過其限參與人數(shù)(主要由教師事先設(shè)定);
(5)教師正選學(xué)生后,該學(xué)生已預(yù)選的其他題目將被自動退選,且該學(xué)生不能再進行預(yù)選或退選操作。
通過上述原則對師生并發(fā)互動的雙向選題過程加以控制。如果學(xué)生發(fā)現(xiàn)本人預(yù)選的題目已被選滿,可及時改選其他題目;教師也可根據(jù)選題情況,及時對本人發(fā)布的題目進行完善與改進,從而調(diào)動了師生參與的積極性。然而,需要避免用戶并發(fā)操作的相互干擾而破壞系統(tǒng)的數(shù)據(jù)一致性。
例如,當(dāng)前教師T1發(fā)布的題目t1已經(jīng)被學(xué)生S1預(yù)選,之后將執(zhí)行“T1針對t1正選S1”的操作A1和“S1退選t1”的操作A2。A1和A2執(zhí)行過程中都會先進行“確認(rèn)S1預(yù)選了t1且沒有被正選”的查詢步驟,再根據(jù)情況確定是否進行正選或退選。如果A1和A2串行執(zhí)行,結(jié)果必然一個成功一個失敗。如果是交錯并發(fā)執(zhí)行,則A1和A2都可能執(zhí)行成功,從而產(chǎn)生數(shù)據(jù)不一致現(xiàn)象。
除了并發(fā)操作之間的相互干擾,在更新數(shù)據(jù)的過程中因系統(tǒng)故障(如服務(wù)器死機、停電等)而出現(xiàn)異常中斷也會造成數(shù)據(jù)不一致。
系統(tǒng)開發(fā)基于B/S(瀏覽器/服務(wù)器)結(jié)構(gòu)[4],采用Apache作為Web服務(wù)器,操作系統(tǒng)為Linux,所有的Web應(yīng)用程序基于跨平臺腳本編程語言PHP進行開發(fā),選用關(guān)系型數(shù)據(jù)庫管理系統(tǒng)MySQL作為數(shù)據(jù)庫服務(wù)器[5]。
選題過程涉及的主要數(shù)據(jù)表及其主要字段如下:
(1)教師表(工號、限正選學(xué)生數(shù)、已正選學(xué)生數(shù));
(2)學(xué)生表(學(xué)號、限預(yù)選題目數(shù)、已預(yù)選題目數(shù)、正選教師工號、正選題目編號);
(3)題目表(編號、名稱、備注、發(fā)布教師工號、限參與學(xué)生數(shù)、已預(yù)選學(xué)生數(shù)、已正選學(xué)生數(shù)、研究類別);
(4)預(yù)選表(學(xué)號、題目編號)。
系統(tǒng)提供了教師發(fā)布、修改和刪除題目信息,學(xué)生預(yù)選或退選題目,教師正選學(xué)生,用戶瀏覽題目,教務(wù)管理員對已被正選學(xué)生的退選(教師不能直接退選),教務(wù)管理員對互選狀況的統(tǒng)計等功能模塊。對于學(xué)生和教師的操作,嚴(yán)格按照前文第1節(jié)提到的“基本選題原則”進行限制。
目前主流關(guān)系型數(shù)據(jù)庫管理系統(tǒng)支持事務(wù)處理及封鎖機制[6](對于 MySQL而言,需選擇InnoDB存儲引擎[7]),為數(shù)據(jù)一致性問題提供了有效解決途徑。
事務(wù)處理機制能夠?qū)⒁唤M邏輯上相關(guān)且連續(xù)的數(shù)據(jù)庫操作系列組建成一個事務(wù),在事務(wù)執(zhí)行期間如果因系統(tǒng)故障而出現(xiàn)異常中斷,數(shù)據(jù)庫能自動恢復(fù)到事務(wù)開始前的狀態(tài),從而避免了此類異常中斷造成的數(shù)據(jù)不一致。
但是,對于因并發(fā)操作干擾而產(chǎn)生的數(shù)據(jù)不一致,還需進一步采用并發(fā)控制理論中的三級封鎖協(xié)議[6]。三級封鎖協(xié)議要求事務(wù)在修改數(shù)據(jù)之前必須申請對該數(shù)據(jù)加排他鎖,使其他事務(wù)對該數(shù)據(jù)不能讀取也不能修改;在讀取數(shù)據(jù)之前必須申請對該數(shù)據(jù)加共享鎖,使其他事務(wù)對該數(shù)據(jù)只能讀取但不能修改。如果事務(wù)因申請加鎖的數(shù)據(jù)已被其他事務(wù)加鎖而暫時申請不成功(即“鎖沖突”),則需等待其他事務(wù)釋放鎖;如果事務(wù)申請加鎖成功,直到其結(jié)束才釋放鎖。通常情況下,該協(xié)議能夠使事務(wù)對數(shù)據(jù)對象的修改或讀取在數(shù)據(jù)一致性方面不會受到其他事務(wù)的干擾。
除了利用上述機制,保證系統(tǒng)數(shù)據(jù)一致性還要注意以下問題。
(1)有時有必要允許一個或多個數(shù)據(jù)表中存在信息冗余,以提高查詢效率,但也會因此帶來數(shù)據(jù)不一致的隱患。為此,只要對所涉及冗余信息相關(guān)的數(shù)據(jù)同步更新,就可以避免信息冗余造成的數(shù)據(jù)不一致。
(2)在數(shù)據(jù)一致性問題上,除了不同身份用戶并發(fā)操作(例如針對同一題目的教師正選和學(xué)生退選)、相同身份的不同用戶并發(fā)操作(例如針對同一學(xué)生的不同教師的正選)的相互干擾,還需防止同一用戶名重復(fù)登錄后并發(fā)操作可能產(chǎn)生的干擾。
(3)要對死鎖和鎖等待超時加以控制。
雖然采用事務(wù)處理及封鎖機制能夠保證數(shù)據(jù)一致性,但也會導(dǎo)致部分事務(wù)“鎖沖突”而使系統(tǒng)并發(fā)性降低,進而對系統(tǒng)性能造成影響[8]。這種影響在并發(fā)訪問量較大時會表現(xiàn)得十分顯著。
有2個原因?qū)е铝吮鞠到y(tǒng)會經(jīng)常面臨高并發(fā)訪問情況:(1)本科畢業(yè)論文選題時間比較集中,甚至幾個院系會同時進行;(2)由于系統(tǒng)已經(jīng)整合到使用范圍更大的實驗教學(xué)管理系統(tǒng)中,經(jīng)常會同時進行其他高并發(fā)訪問的教務(wù)活動(如針對實驗室或?qū)嶒炚n堂的特定時段的開放預(yù)約)。
實際上,在數(shù)據(jù)庫設(shè)計、應(yīng)用程序設(shè)計、運行環(huán)境配置等系統(tǒng)開發(fā)的各個環(huán)節(jié)中,可以采取多種優(yōu)化措施來兼顧系統(tǒng)并發(fā)性[8-9]。本文主要從減少“鎖沖突”的角度做進一步探討。
(1)利用MySQL的InnoDB存儲引擎支持的“行級鎖”[7]。只要對數(shù)據(jù)表建立索引,就可以通過索引對數(shù)據(jù)表中部分記錄加鎖,從而使涉及不同記錄的事務(wù)在并發(fā)執(zhí)行中不會出現(xiàn)“鎖沖突”。
(2)利用信息冗余,減少執(zhí)行頻度較高的查詢語句封鎖對象的數(shù)目。例如題目表中的冗余信息“已正選學(xué)生數(shù)”可以使用戶查詢所有題目正選狀況時不會封鎖學(xué)生表中的記錄,但教師正選學(xué)生時必須同時封鎖并更新題目表和學(xué)生表中的記錄。相對而言,“查詢題目正選狀況”的執(zhí)行頻度比“教師正選學(xué)生”高得多,因而該信息冗余的設(shè)計非常有必要。
(3)與多數(shù)信息管理系統(tǒng)相似,本系統(tǒng)對查詢操作的數(shù)據(jù)一致性要求不高,不將其組建成事務(wù),以減少其同時封鎖對象的數(shù)目。例如,教師在正選操作時可能發(fā)現(xiàn)某一題目“預(yù)選學(xué)生人數(shù)”比列出的“預(yù)選學(xué)生名單”多或少1個人,這是因為在查詢題目表和預(yù)選表之間某一學(xué)生進行了退選或預(yù)選操作,但這不會影響系統(tǒng)的數(shù)據(jù)一致性。
(4)對于非訪問數(shù)據(jù)庫的、執(zhí)行較慢的程序語句,盡量放在事務(wù)加鎖語句之前,以縮短封鎖時間。例如,教師修改已經(jīng)發(fā)布的題目信息,可以將任務(wù)書上傳并存放為臨時文件(較慢)之后再進入事務(wù),而事務(wù)內(nèi)部則根據(jù)數(shù)據(jù)庫更新是否成功,將該臨時文件替換掉原文件或刪除(較快)。
(5)實時性要求不高、封鎖對象較多的批處理操作盡量避免在并發(fā)訪問量較大時執(zhí)行。例如,教務(wù)管理員希望每天對所有題目的互選狀況按照研究類別、所屬教師教研室等進行批量統(tǒng)計。為此,系統(tǒng)采取了一種基于Agent(智能代理)程序[10]的批處理操作方式,即在并發(fā)訪問量較大時,僅將批處理的指令提交到數(shù)據(jù)表中,并置為“待執(zhí)行”狀態(tài);Agent程序定期自動檢測系統(tǒng)并發(fā)狀況和該數(shù)據(jù)表,在并發(fā)訪問量較小時自動完成其中“待執(zhí)行”狀態(tài)的指令,并修改其狀態(tài);教務(wù)管理員下次登錄后可以查看這些指令的執(zhí)行狀態(tài)。
(6)要避免死鎖。
多個并發(fā)事務(wù)已經(jīng)分別封鎖了數(shù)據(jù)對象,同時每個事務(wù)都在請求對其他事務(wù)已封鎖數(shù)據(jù)對象的加鎖,形成循環(huán)“鎖沖突”現(xiàn)象,即死鎖。
在本系統(tǒng)中,假設(shè)當(dāng)前學(xué)生S1和S2都可預(yù)選3個題目,且S1已預(yù)選教師T1發(fā)布的題目t1和教師T2發(fā)布的題目t2,教師T3發(fā)布了題目t3,之后可能發(fā)生死鎖的情況列舉如下。
(1)“S2預(yù)選t1”的事務(wù)B1和“T1針對t1正選S1”的事務(wù)B2并發(fā)執(zhí)行。B1和B2都需要封鎖題目表t1記錄以確認(rèn)t1未被選滿、封鎖教師表T1記錄以確認(rèn)T1未被選滿,如果B1先封鎖題目表t1記錄,B2再封鎖教師表T1記錄,之后B1和B2都將試圖封鎖對方已封鎖的記錄,則產(chǎn)生死鎖。
(2)“T1針對t1正選S1”的事務(wù)C1和“T2針對t2正選S1”的事務(wù)C2并發(fā)執(zhí)行。C1和C2都需要封鎖題目表中的t1和t2記錄并修改其已正選或預(yù)選學(xué)生數(shù),如果C1先封鎖并修改t1記錄,C2再封鎖并修改t2記錄,之后C1和C2都將試圖封鎖對方已封鎖的記錄,則產(chǎn)生死鎖。
(3)“S1預(yù)選t3”的事務(wù) D1和“S2預(yù)選t3”的事務(wù)D2并發(fā)執(zhí)行。按照三級封鎖協(xié)議,D1和D2先后都可成功對題目表中t3記錄加共享鎖,以確認(rèn)t3未被選滿,之后它們都將試圖對該t3記錄加排他鎖以修改t3的已預(yù)選學(xué)生數(shù),則產(chǎn)生死鎖。
MySQL的InnoDB存儲引擎一般能自動檢測到死鎖的發(fā)生,使其中一個事務(wù)釋放鎖并回退到起始狀態(tài),而另一個事務(wù)獲得鎖并繼續(xù)運行。然而,如果不加以控制,死鎖會產(chǎn)生以下問題。
(1)被回退的事務(wù)并沒有被撤銷,回退點之前的SQL語句也不會再被執(zhí)行。由于網(wǎng)站PHP程序以嵌入方式使用SQL語句訪問MySQL,被回退的事務(wù)還會繼續(xù)執(zhí)行回退點之后的SQL語句,從而可能會破壞系統(tǒng)的數(shù)據(jù)一致性。
(2)死鎖是“鎖沖突”的特殊形式,由于還受到回退等因素的影響,往往會使系統(tǒng)并發(fā)性進一步降低[8]。
除了死鎖,鎖等待超時也是并發(fā)操作可能導(dǎo)致的事務(wù)故障,其主要是指由于并發(fā)訪問量較大等原因,發(fā)生“鎖沖突”而被迫等待的事務(wù)等待時間過長(默認(rèn)值為50秒),則系統(tǒng)將取消該事務(wù)中相應(yīng)的加鎖語句的執(zhí)行。與死鎖情況類似,由于該加鎖語句之后的SQL語句還能夠繼續(xù)被執(zhí)行,從而可能造成數(shù)據(jù)不一致。針對這些事務(wù)故障,本系統(tǒng)主要采取了以下措施:
(1)預(yù)先對系統(tǒng)中的所有數(shù)據(jù)表進行排序,對每個數(shù)據(jù)表中的記錄則按主碼進行排序,而所有事務(wù)對其所涉及的數(shù)據(jù)表或記錄,只能按照預(yù)設(shè)順序申請加鎖。該措施可避免與上文列舉的死鎖情況(1)和(2)類似的情況。
(2)如果事務(wù)對某記錄查詢之后還要再修改,則在查詢之前一次性對該記錄申請加排他鎖。該措施可避免與上文列舉的死鎖情況(3)類似的情況。
(3)針對事務(wù)中所有的加鎖語句,能夠捕捉到死鎖和鎖等待超時等造成的異常,并且在該異常發(fā)生時撤銷整個事務(wù),給出“系統(tǒng)忙”的提示并返回之前的操作界面。該措施能防止鎖等待超時、由于系統(tǒng)改進等原因還未設(shè)法避免的死鎖等可能造成的數(shù)據(jù)不一致。
本文所介紹的畢業(yè)論文選題系統(tǒng)于2009年9月整合到中南民族大學(xué)實驗教學(xué)與實驗室開放管理系統(tǒng)[11-12](http://labsystem.scuec.edu.cn)中,已在 該校計算機科學(xué)學(xué)院、化學(xué)與材料科學(xué)學(xué)院、外語學(xué)院、經(jīng)濟學(xué)院等院系正常使用了4年,平均每學(xué)年完成約5 800名學(xué)生、990名教師的畢業(yè)論文選題。由于本科畢業(yè)論文參與人數(shù)多、協(xié)作性強,在該系統(tǒng)中引入事務(wù)處理及封鎖機制,可以增強師生雙向選題的互動性,充分調(diào)動師生參與選題乃至整個畢業(yè)論文教學(xué)的積極性,進而對畢業(yè)論文教學(xué)的順利實施和畢業(yè)論文水平的提高起到很好的促進作用。
(
)
[1]付小龍,宣華,袁芳,等.新一代綜合教務(wù)管理系統(tǒng)技術(shù)體系的設(shè)計與實現(xiàn)[J].實驗技術(shù)與管理,2011,28(4):95-100.
[2]王利江.基于完全學(xué)分制教務(wù)管理系統(tǒng)的改進和完善[J].內(nèi)蒙古師范大學(xué)學(xué)報:教育科學(xué)版,2012,25(3):91-93.
[3]宣華,郭大勇,羅念龍.依托信息技術(shù)的高?,F(xiàn)代化教學(xué)支撐平臺[J].清華大學(xué)學(xué)報:自然科學(xué)版,2009,49(8):1245-1248.
[4]許龍飛,李國和,馬玉書.Web數(shù)據(jù)庫技術(shù)與應(yīng)用[M].北京:科學(xué)出版社,2005.
[5]劉乃琦,李忠.PHP和MySQL Web應(yīng)用開發(fā)[M].北京:人民郵電出版社,2013.
[6]薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概論[M].3版.北京:高等教育出版社,2000.
[7]唐漢明,翟振興,蘭麗華,等.深入淺出MySQL數(shù)據(jù)庫開發(fā)、優(yōu)化與管理維護[M].北京:人民郵電出版社,2008.
[8]牛新莊.DB2數(shù)據(jù)庫性能調(diào)整和優(yōu)化[M].北京:清華大學(xué)出版社,2009.
[9]李軍.高并發(fā) Web系統(tǒng)的設(shè)計與優(yōu)化[D].北京:北京交通大學(xué),2009.
[10]王攀,魯強,曾紹群,等.基于 Web信息自動獲取構(gòu)建生物信息二級數(shù)據(jù)庫[J].高技術(shù)通訊,2004,14(5):28-31.
[11]王攀,陳少平,王晶,等.基于 Web的實驗室開放管理系統(tǒng)的設(shè)計與實現(xiàn)[J].現(xiàn)代教育技術(shù),2008,18(10):101-104.
[12]王攀,王晶,陳少平.基于Web的實驗教學(xué)管理系統(tǒng)的設(shè)計與實現(xiàn)[J].中國電化教育,2010(2):115-118.