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