簡體   English   中英

將事務與ADO.NET數據適配器一起使用

[英]Using transactions with ADO.NET Data Adapters

方案:我想讓多個(大概2到20個)服務器應用程序通過ADO.NET使用單個數據庫。 我希望各個應用程序能夠擁有數據庫中記錄集的所有權,將它們保留在數據集中的內存中(以提高速度),響應數據上的客戶端請求,執行更新,並防止其他應用程序更新這些記錄直到所有權已被放棄。

我是ADO.NET的新手,但似乎可以使用帶有數據適配器(ADO.NET斷開連接層)的事務來實現。

問題部分1:嘗試這樣做的正確方法嗎?

問題第二部分:如果這是正確的方法,誰能指出我這種方法的任何教程或示例(在C#中)?

問題部分3:如果我希望能夠獲得單個記錄的所有權並獨立釋放它們,那么我是否需要為每個記錄進行單獨的交易,並通過擴展單獨的DataAdapter和DataSet來保存每個記錄,或者是否需要更好的方法呢? 每個應用程序可能同時擁有數千個記錄的所有權。

  • 您考慮保持交易多久了?
  • 您要支持多少個並發用戶?

這是您需要問自己的兩個問題。 如果前者的答案是“很長一段時間”,而后者的答案是“很多”,那么這種方法可能會遇到問題。

因此,我對第一個問題的回答是:不,這可能不是正確的方法。

如果您采用事務鎖定方法,那么將限制可伸縮性和響應時間。 您也可能會遇到數據庫錯誤。 例如,SQL Server(假設您正在使用SQL Server)可能非常貪婪地使用了鎖定,並且可能鎖定了比您請求/期望的資源更多的資源。 應用程序可以請求一些行級別的鎖來鎖定它“擁有”的記錄,但是SQL Server可以將這些行鎖升級為表鎖。 這將阻止並可能導致超時或死鎖。

我認為滿足要求的最佳方法是編寫鎖管理器/記錄簽出系統。 馬丁·福勒(Martin Fowler)將此稱為悲觀的離線鎖

更新

如果您使用的是SQL Server 2008,則可以在表級別上設置鎖升級行為:

ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);

這將在“大多數”情況下禁用鎖升級,並可能對您有所幫助。

實際上,您需要並發控制以及事務支持。

僅當您對數據庫執行多個操作時, Transaction才會出現。 釋放連接后,該交易將不再適用。

concurrency使您可以對同一數據進行多個更新。 如果兩個或多個客戶端擁有相同的數據集,而一個需要在另一客戶端更新數據后讀取/寫入數據,則並發將讓您決定保留哪一組更新,而忽略哪一組更新。 提到並發的概念超出了本文的范圍。 結帳文章以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM