2011-07-28 151 views
0

我得到了兩個有時同時運行的進程。SQL Bulk Insert Vs Update - DeadLock問題

第一個是大容量插入

using (var connection = new SqlConnection(connectionString)) 
      { 
       var bulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.TableLock) 
            {DestinationTableName = "CTRL.CTRL_DATA_ERROR_DETAIL",}; 
       connection.Open(); 
       try 
       { 
        bulkCopy.WriteToServer(errorDetailsDt); 
       } 
       catch (Exception e) 
       { 
        throw new Exception("Error Bulk writing Error Details for Data Stream ID: " + dataStreamId + 
             " Details of Error : " + e.Message); 
       } 
       connection.Close(); 
      } 

第二個是批量更新從存儲過程

--Part的代碼從存儲Procedure--

UPDATE [CTL].[CTRL].[CTRL_DATA_ERROR_DETAIL] 
      SET [MODIFIED_CONTAINER_SEQUENCE_NUMBER] = @containerSequenceNumber 
       ,[MODIFIED_DATE] = GETDATE() 
       ,[CURRENT_FLAG] = 'N' 
      WHERE [DATA_ERROR_KEY] = @DataErrorKey 
       AND [CURRENT_FLAG] ='Y' 

首先進程運行一段時間(取決於傳入的記錄負載)和第二個進程總是會陷入死鎖的受害者。

我應該設置SqlBulkCopyOptions.TableLock,以便第二個進程等到資源被釋放。

回答

1

默認情況下,SqlBulkCopy不會佔用排它鎖,因此當它執行它的操作並插入數據時,更新過程就會啓動並導致死鎖。爲了解決這個問題,您可以指示SqlBulkCopy按照您的建議採用獨佔表鎖,或者您可以將批量插入的批處理大小設置爲合理的數字。

如果你能擺脫它,我認爲桌上鎖的想法是最好的選擇。