熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ADO.NET的並行控制與數據存取沖突偵測

2013-11-13 10:30:59  來源: .NET編程 
      日前台灣高鐵及其系統包商所開發的訂票系統曾出現大量重復訂位之情形產生了「車次時段與路程」都一模一樣的重復序號類似此種訂票系統除了可使用 Webbased 架構外若考慮到斷線的處理作業是否能在斷線的情況下還能夠交易那麼還可考慮 clientserver 的架構如此一來就要設計各個 client side 可以配給的車號數量以及恢復斷線後再同步的機制才能夠實時處理並盡可能避免重復劃位的現象
     
      若要避免產生重復劃位先剔除系統架構的分析設計OOAD 落實與否的問題不看單就編程技術來探討較簡單的做法是采用 ADONET 的「交易 (Transaction)」寫法讓某位訂票者在交易座位 A 時其它人都無法讀取此 A 座位一直到他的交易結束為止亦可搭配使用 dirty read 去強行讀取類似數據庫的「獨占鎖定 (exclusive lock)」讓某人修改數據時其它人連讀取都不行 (亦會限制同時在線數量)此種「獨占鎖定」類似 ADONET 的「封閉式 (悲觀) 並行存取」機制雖然會長時間從數據被讀取開始即將其鎖定但至少可保證交易一定有效像這種資料 lock 的機制只要撰寫 Transaction 程序或是調整數據庫的鎖定策略鎖定提示就可做到此外還可搭配使用數據庫的 TimeStamp 計數器判斷「數據列 (row)」中的任何值是否有任何改變另外 SQL Server 還有更優越的「Snapshot Isolation 快照隔離模式」其提供一種新的隔離層級可將寫入流程讀取流程作適當地隔離使得讀取動作不等待寫入動作寫入動作不干擾讀取動作以提高數據的可用性加快交易的執行速度
     
      至於 ASPNET / Visual Studio 亦提供了入門級的解決方案可由 SqlDataSource 等數據存取控件的圖形設定接口中勾選「進階」按鈕內的「使用開放式並行存取」選項即可啟動沖突偵測機制 (ConflictDetection 屬性)此舉會將控件預設的「OverwriteChanges」改為「CompareAllValues」並判斷數據從剛才第一次讀取到更新的這段期間內是否曾被其它使用者變更過此一選項亦即 ADONET 的「開放式 (樂觀) 並行存取」機制只有當數據正在修改時才會進行鎖定並在修改完後再對各個「數據域 (column)」的新舊數據進行比對看是否曾在這段期間內搶先被其它使用者修改了同一筆記錄但其它所有使用者仍可在此時去讀取類似於數據庫的「共享鎖定 (shared lock)」若未勾選「使用開放式並行存取」此一選項時即會采用預設的「後進先寫入」機制這種做法也是只在修改時才會鎖定但不會將更新後的數據與原始數據作比對因此有可能發生欲修改的數據被其它使用者覆寫掉之情形
   
From:http://tw.wingwit.com/Article/program/net/201311/13870.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.