多線程并發訪問數據庫,ADO.NET 2.0 的并行控制與數據存取沖突偵測

 2023-10-06 阅读 26 评论 0

摘要:日前臺灣高鐵及其系統包商所開發的訂票系統,曾出現大量重復訂位之情形,產生了「車次、時段與路程」都一模一樣的重復序號。類似此種訂票系統,除了可使用 Web-based 架構外,若考慮到斷線的處理作業,是否能在斷線的情況下還能夠交易,

日前臺灣高鐵及其系統包商所開發的訂票系統,曾出現大量重復訂位之情形,產生了車次、時段與路程都一模一樣的重復序號。類似此種訂票系統除了可使用 Web-based 架構外,若考慮到斷線的處理作業,是否能在斷線的情況下還能夠交易,那么還可考慮 client-server 的架構,如此一來就要設計各個 client side 可以配給的車號、數量,以及恢復斷線后再同步的機制,才能夠實時處理,并盡可能避免重復劃位的現象。

若要避免產生重復劃位,先剔除系統架構的分析設計OOAD 落實與否的問題不看單就編程技術來探討,較簡單的做法是采用 ADO.NET 的「交易 (Transaction)寫法。讓某位訂票者在交易座位 1A 時,其它人都無法讀取此 1A 座位,一直到他的交易結束為止,亦可搭配使用 dirty read 去強行讀取;類似數據庫的「獨占鎖定 (exclusive lock)」,讓某人修改數據時其它人連讀取都不行 (亦會限制同時在線數量)。此種「獨占鎖定」類似 ADO.NET 的「封閉式 (悲觀) 并行存取」機制,雖然會長時間從數據被讀取開始即將其鎖定,但至少可保證交易一定有效。像這種資料 lock 的機制只要撰寫 Transaction 程序,或是調整數據庫的鎖定策略、鎖定提示就可做到。此外還可搭配使用數據庫的 TimeStamp 計數器,判斷數據列 (row)」中的任何值是否有任何改變。另外 SQL Server 2005 還有更優越的Snapshot Isolation 快照隔離模式,其提供一種新的隔離層級,可將寫入流程、讀取流程作適當地隔離,使得讀取動作不等待寫入動作、寫入動作不干擾讀取動作,以提高數據的可用性、加快交易的執行速度。

至于 ASP.NET 2.0 / Visual Studio 2005 亦提供了入門級的解決方案,可由 SqlDataSource 等數據存取控件的圖形設定接口中,勾選「進階」按鈕內的「使用開放式并行存取」選項,即可啟動沖突偵測機制 (ConflictDetection 屬性)。此舉會將控件預設的「OverwriteChanges」改為「CompareAllValues」,并判斷數據從剛才第一次讀取到更新的這段期間內,是否曾被其它使用者變更過,此一選項亦即 ADO.NET 的「開放式 (樂觀) 并行存取」機制,只有當數據正在修改時才會進行鎖定,并在修改完后再對各個「數據域 (column)」的新舊數據進行比對,看是否曾在這段期間內搶先被其它使用者修改了同一筆記錄;但其它所有使用者仍可在此時去讀取,類似于數據庫的「共享鎖定 (shared lock)」。若未勾選「使用開放式并行存取」此一選項時,即會采用預設的「后進先寫入」機制,這種做法也是只在修改時才會鎖定,但不會將更新后的數據與原始數據作比對,因此有可能發生欲修改的數據被其它使用者覆寫掉之情形。


-------------------------------------------------
(本文在版工的舊 Blog 中,發表日期為 2007/01/07)
(本文有些 Hyperlink 是連到臺灣的網站,內地的網友可能會無法開啟連結)

轉載于:https://www.cnblogs.com/WizardWu/archive/2008/07/04/1235180.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/120653.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息