我有一個執行一些更新到數據庫的asp.net頁面。更新需要2-3秒,所有這些都需要先從db中讀取數據並做一些更新。當這些操作的頁面請求小於2秒時,db讀取代碼,讀取db中記錄的相同狀態,並且asp.net頁面請求的所有更新操作都會更新相同的記錄。asp.net鎖定頁面方法,直到動作完成
我怎樣才能防止這些,最新的請求等待直到最老的完成他們的執行?
任何想法?
我有一個執行一些更新到數據庫的asp.net頁面。更新需要2-3秒,所有這些都需要先從db中讀取數據並做一些更新。當這些操作的頁面請求小於2秒時,db讀取代碼,讀取db中記錄的相同狀態,並且asp.net頁面請求的所有更新操作都會更新相同的記錄。asp.net鎖定頁面方法,直到動作完成
我怎樣才能防止這些,最新的請求等待直到最老的完成他們的執行?
任何想法?
如果我正確地理解了你,你想阻止訪問一組特定的方法,直到過程完成。
足夠簡單...創建一個靜態方法並實現一個lock()。您可以通過共享鎖,讀取/寫入鎖升級等方式獲得真正的樂趣......但基本原理是您鎖定共享代碼的關鍵部分,以便其他用戶無法進入這些部分。
http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.71).aspx
鎖關鍵字標誌着一個語句塊作爲通過獲得互斥鎖給定對象,執行語句,然後解除鎖定的一個關鍵部分。
static object lockObject = new Object();
static bool inProgress = false;
static void MyProcess()
{
if(inProgress) return;
lock(lockObject)
{
try{
inProgress = true;
// critical code here
}
finally
{
inProgress = false;
}
}
}
使用適當的隔離級別和數據庫鎖定:這將確保正確處理任何客戶端(任何事務是精確的)並且預先保存數據完整性(檢查isolation levels)。
我建議使用READ COMMITTED,它可以確保您永遠不會讀取未提交的數據,並且在對同一條記錄進行更新期間,事務處於排隊狀態。
你能告訴我們一些代碼嗎? – 2012-03-18 12:08:52
要同步訪問相同數據的不同頁面(或任何客戶端),您需要使用數據庫鎖定。你使用的是哪個數據庫? – Strillo 2012-03-18 12:09:56
我正在使用MS SQL 2008,使用ADO.NET數據集來讀取數據和更新。 – 2012-03-18 12:12:26