摘要:載貨車輛稱重管理系統在大型廠礦企業中占據重要的地位。在該系統中,通常一些用戶擁有相同的使用權限,如果這些用戶不加以合理控制會破壞數據庫一致性,因此怎樣避免數據共享中的沖突通常是在系統開發過程中需要解決的關鍵問題。本文針對稱重管理中多用戶共享訪問實時數據庫數據時出現的問題,探討了并發控制機制和解決并發控制的方法。
關鍵詞:數據庫;并發控制;事務;游標;稱重管理
中圖分類號:TP311文獻標識碼:A 文章編號:1009-3044(2008)33-1307-03
Research and Implementation of the Laden Vehicle Weight Management System of Concurrency Control Indatabase System
YANG Shu-qing, SUN Pei-yan
(North University of China ,School of Electronics and Computer Science and Technology,Taiyuan 030051,China)
Abstract:The weight management system of Laden vehicle takes an important position in large factories . Usually , some users have the same right of use in the system, if these users are not been controlled reasonablly, the database consistency can been breaken, so how to avoid conflict of Data sharing is usually an important problem,which?need solved in the system development processing. After studing the theories of database concurrency control ,the paper explores the implementation of concurrency control in weighing in weight management system of Laden vehicle of multi-user database to share real-time data access problems database system .
Key words: Database;concurrency control; transaction; cursor; weight management
1 簡介
載貨車輛稱重管理系統主要是針對大型廠礦中原料采購、成品銷售及廠內物資調撥過程進行的計量管理,可以通過網絡實現數據共享。本系統可以自動采集稱重儀表中毛重、皮重、車輛牌照等信息,這些信息不能手工輸入,杜絕人為因素的干擾,防止大車過磅小車回皮或小車過磅大車回皮的現象發生,杜絕司機的作弊行為。管理人員在查詢磅房的歷史稱重記錄時,可同時調出當時的現場圖片和重量兩組信息可供對比,確保稱重過程的準確可靠,透明,公正。通過該系統可以提高企業管理水平,防止稱重作弊,堵塞管理漏洞,有效控制成本,提高工作效率,起到了非常積極的作用。
數據庫是一個共享資源,當多個用戶并發地訪問數據庫時就會產生多個事務同時存取同一數據的情況。若此時對并發操作不加控制就可能導致讀取和存儲不正確的數據,破壞數據庫的一致性。所以在數據庫系統中提供并發控制機制是必須的。
本文旨在研究數據庫并發控制理論的基礎上,結合實際的數據庫系統對系統中的并發控制的實現方法進行一些研究。
2 多用戶并發控制理論
2.1 事務定義及其特性
數據庫中一個重要概念是事務,它是一系列要么都做,要么都不做的數據庫操作的集合。事務具有四個基本特性:原子性,一致性,隔離性和持久性四個特性。事務并發操作帶來的數據不一致性包括:丟失修改,不可重復讀和讀“臟”數據,這是因為并發操作破壞了事務的特性。保證事務的調度執行滿足上述四個性質是所有的數據庫管理系統必須的,這樣才能確保數據庫始終從某個一致性狀態轉變到另一個一致性狀態。
2.2 事務并發控制機制
常用的并發控制機制有:基于鎖協議的并發控制機制,沖突圖檢測并發控制機制,時間戳并發控制機制,樂觀并發控制機制。
2.2.1 基于鎖協議的并發控制機制
基本的鎖類型有兩種:排它鎖(簡稱X鎖)和共享鎖(簡稱S鎖)。若事務T對數據元素A加上X鎖,則只允許T讀取和修改A,其他任何事務都不能再對A加上任何類型的鎖,直到T釋放A上的鎖。這樣就保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。若事務T對數據元素A加上S鎖,則T只可以讀A,其他任何事務只能再對A加上S鎖,而不能加X鎖,直到T釋放A上的S鎖。這樣就保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能再對A做任何修改。在某些特殊的條件下,數據庫中還會引入更新鎖和增量鎖。
兩段鎖協議(2PL)是最常用的一種鎖協議。所謂兩段鎖協議,是指所有事務必須分兩個階段對數據元素加鎖和解鎖。在對任何數據元素進行讀、寫操作之前,首先要申請并獲得對該數據元素的加鎖;在釋放一個鎖后,事務不再申請和獲得其他鎖。“兩段”的含義是,事務分兩個階段,第一階段是加鎖階段,也稱為擴展階段。在加鎖階段中,事務可以申請獲得任何數據元素上的任何類型的鎖,但是不能釋放鎖。第二階段是解鎖階段,也稱為收縮階段。在解鎖階段,事務可以釋放任何數據對元素上的任何類型的鎖,但是不能再加任何鎖。可以證明,若并發執行的所有事務均遵守兩段鎖協議,則任何對并發事務的調度算法都是可串行化的1。
2.2.2 沖突圖檢測并發控制機制
檢測并發控制機制的首要問題是構造沖突圖。沖突圖中的結點表示處于活躍狀態的事務。對于處于活躍狀態的事務p 和 q,在對數據元素 x 進行并發操作時,如果至少存在一個關于x 的寫操作,且沒有其它事務對x 進行操作,則稱p 和 q 是沖突事務。若事務 p 的沖突操作在 q的沖突操作之前,則在沖突圖中有從結點p 到q 的一條有向邊。以活躍事務結點,以所有處于活躍狀態的沖突事務為有向邊,就構成了沖突圖。通過檢測在沖突圖不存在環路,可以保證并發時數據的一致性,實現事務并發調度2。
2.2.3 時間戳法并發控制機制
在時間戳并發控制機制中,調度器需要在每個事務賦予一個唯一的數值(時間戳)。該數值必須在事務首次通知調度器時按升序發出。對于數據庫中的每個元素,都與兩個時間戳聯系起來,這兩個時間戳分別為讀取數據元素x的事務中最大時間戳,即最近一次讀取x的事務時間戳,記做 RTM(x),寫數據元素x的事務中最大時間戳即最近一次寫x的事務時間戳,記做WTM(x)。調度器負責維護當前的活動事務及其時間戳表。
2.2.4 樂觀并發控制
樂觀方法的基本思想是:對事務運行時可能發生的沖突操作不預處理,待事務結束時再進行檢測。
樂觀方法與悲觀方法(如2PL)的區別主要在于對數據庫并發事務發生沖突概率的假設不同,樂觀方法認為不同用戶之間所需的數據資源發生沖突的可能性很小,所以允許事務執行后驗證,悲觀方法則相反。根據實際應用環境的不同,樂觀方法和悲觀法的并發調度性能有不同的表現。
以上的并發控制機制各有利弊,對于不同的應用,使用的并發控制機制也不同。雖然沖突圖檢測并發控制機制有很多優點,但是,在確定環路存在的情況下,必須通過強制事務中終止的方式來保證沖突圖中不存在環路,確保數據的一致性。時間戳法并發控制機制雖然沒有延遲事務,但導致其重啟的可能性遠大于鎖協議的回滾。重啟在某中程度上是延遲事務的一種更嚴重的形式,消耗了更多的系統性能4。

表1 載貨車輛信息(autotable)
3 載貨車輛稱重系統中并發控制機制的實現方法
3.1 載貨車輛稱重管理系統模塊以及存在的并發操作
載貨車輛稱重管理系統中,包括四個模塊:①安全檢查模塊②稱重管理模塊③倉庫管理模塊④監控中心模塊
在此系統的幾個模塊中,存在多用戶對同一數據訪問的情況:
1)在安全檢查模塊①中,大型廠礦出入門不只一個,同時會有兩個或多個用戶更改同一車輛的出入廠信息。
2)在模塊④和模塊②中,監控中心要查看統計相應的載貨車輛稱重的信息,同時稱重處正在稱重,此時對于稱重處相應的事務要加上鎖,不允許別的用戶訪問,等待此事務執行完畢才允許監控中心用戶進行操作,這些控制是必需的。
3.2此系統中并發控制的實現方法
以便下面控制機制實現方法的介紹,引入載貨車輛信息表的各個數據項如表1。
對于本系統可以采用更新游標、顯式加鎖、更改事務隔離級別等并發控制。在使用時應注意事項有:①只有在數據一致性要求特別嚴格、并發度要求不高時采用可重復讀與可串行讀的隔離級別; ②在同一個事務當中,要適當根據需要來變更數據的鎖定級別,但一般不使用TABLOCK這樣粗粒度的封鎖; ③在包含客戶交互的操作中使用游標,并盡可能縮短交互時間。
介于上述四種并發機制和對載貨車輛稱重管理系統的研究,使用鎖機制和更新游標控制來實現的并發控制更適合于這個系統。使用更新游標的方法實現稱重管理員對載貨車輛的車輛編號和車輛凈重等信息的瀏覽和修改,下面代碼是C語言編寫的3 ,
EXEC SQL DECLAREautocursorCURSOR FOR autoNO, netweight /*定義車輛游標autocursor,
SELECT FROMautotableFOR UPDATE;并將游標autocursor與查詢的結果相關聯*/
EXEC SQL OPEN autocursor; ∥將車輛游標打開
for(;; ) ∥使用for 循環來讀取游標中的全部記錄
{EXEC SQL FETCH autocursor INTO: autoNO: netweight;∥推進游標,從游標中讀記錄,送相應的主變量
If(code < >SUCCESS)break;∥如果記錄取完,則退出循環
……∥將所有記錄的內容顯示
EXEC SQL UPDATEautotable SET autoNO = :”要輸入的值” ∥更新數據
WHERE CURRET ofautocursor;
}
EXEC SQL CLOSE autocursor ∥關閉游標
上面的方法的缺點是即使用戶不對當前記錄進行修改,也要對當前的記錄加鎖,這樣就影響了事務并發度,此時可采用另一種方法:定義一個滾動游標來完成查詢;獲取游標的一個記錄,顯示給用戶;用戶瀏覽記錄,直到要修改或者刪除的記錄;當用戶選擇修改一個記錄時,為用戶想要修改的記錄定義一個更新游標;使用更新游標獲取記錄,并重新顯示鎖定的記錄;更新這個記錄。那么上面的代碼可以更改為:
EXEC SQL DECLARE autocursor SCROLL CURSOR for
SELECT autoNO:auto-netweightFROM autotable;
EXEC SQL OPEN autocursor
for( ; ;)
{EXEC SQL FETCH autocursor INTO: autoNO: netweight;
…∥顯示記錄內容給用戶
EXEC SQL DECLARE autocursor update CURSOR FOR SELECT netweight
FROM autotable WHERE autoNO = :”修改之后的值”; ∥定義更新游標
EXEC SQL FETCH autocursor UPDATE INTO: netweight; ∥讀取數值
EXEC SQL UPDATE autotable SET auto-netweight = :”新的值” WHERE CURRENT ofautocursorUPDATE;
系統中還需要用其它的控制機制,提高系統并發度,從而提高系統的性能,這一點還是很重要的,這有待于繼續研究。
4 結論
本文主要采用了鎖機制和游標控制方法實現數據的并發控制,但是實現并發控制機制的方法還有很多,例如有借助于表的修改,借助于新的開發工具等。這些方法將更好的提高本系統中的并發機制,同時成為進一步研究內容。
參考文獻:
[1] 薩師煊,王珊.數據庫系統概論[M](第3版).北京:高等教育出版社,2000.
[2] 王能斌.數據庫系統原理[M].北京:電子工業出版社,2001.
[3] 董迎紅.信息管理系統中多用戶并發控制理論及應用[J].現代情報,2005.12(12).
[4] 段玉春,孫玉強.數據庫管理系統中并發事務的控制方法[J].信陽師范學院學報,2004.7(17).