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