2008-12-09 74 views
1

我在ASP.NET應用程序中得到這個進程併發:SQL Server 2005中 - 管理上表

  • 開始連接
  • 開始交易
  • 插入表「LoadData」一SqlBulkCopy類中的很多值包含一個包含特定LoadId的列。
  • 調用一個存儲過程:
    • 讀取特定LoadId的表「LoadData」。
    • 對於每一行都進行大量計算,這意味着要讀取數十個表並將結果寫入臨時(#temp)表(最後幾分鐘的過程)。
    • 刪除特定LoadId的「LoadDate」中的行。
    • 完成一切後,將結果寫入結果表。
  • 提交交易或者如果事情失敗回滾。

我的問題是,如果我有2個用戶啓動進程,第二個將不得不等待前一個已完成(因爲插入似乎把一個排他鎖),我的應用程序有時在超時(並且用戶不高興等待:))。

我正在尋找一種方法能夠有,做一切並行,因爲沒有互動的用戶,除了最後一個:寫的結果。我認爲阻止我的是「LoadData」表中的插入/刪除操作。 我檢查了其他事務隔離級別,但似乎沒有任何東西可以幫助我。

什麼是完美的是,能夠刪除「LoadData」表上的排他鎖(可以強制SqlServer只鎖定行而不是表?),當插入完成時,但沒有結束交易。

有什麼建議嗎?

回答

1

查找聯機叢書中的SET TRANSACTION ISOLATION LEVEL READ提交快照。

+0

事務級別`READ COMMITTED SNAPSHOT`救了我很多情況下! – 2010-07-29 13:02:44

1

事務應該覆蓋小而且快速執行的SQL /代碼段。他們傾向於在不同的平臺上以不同的方式實施。他們將鎖定表格,然後隨着修改的增長展開鎖定,從而鎖定其他用戶查詢或更新同一行/頁面/表格。

爲什麼不忘記事務,並以另一種方式處理錯誤?您的數據完整性是否真正被交易保護,或者您是否可以在沒有交易的情況下完成?

1

如果你確定有是除了最後一部分cioncurrent操作沒有問題,爲什麼只是那些最後陳述,無論他們是那些需要隔離)之前不會啓動該交易,並承諾他們成功後立即..然後所有的前期讀取操作將不會彼此阻塞...