2011-07-28 2 views
0

두 프로세스가 동시에 실행되는 경우가 있습니다.SQL 대량 삽입 업데이트 - 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(); 
      } 

두 번째는 저장에서 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' 

먼저 절차

코드의

--Part를 저장에서 대량 업데이트입니다 프로세스가 (들어오는 레코드로드에 따라) 약간의 시간 동안 실행되고 두 번째 proc 에드워드는 항상 교착 상태의 희생자가됩니다.

두 번째 프로세스가 리소스가 해제 될 때까지 대기하도록 SqlBulkCopyOptions.TableLock을 설정해야합니까?

답변

1

기본적으로 SqlBulkCopy는 단독 잠금을 사용하지 않으므로 업데이트 프로세스가 시작되어 교착 상태가 발생합니다. 이 문제를 해결하기 위해 SqlBulkCopy가 이미 제안한 것처럼 단독 테이블 잠금을 사용하도록 지시하거나 대량 삽입의 일괄 처리 크기를 적당한 수로 설정할 수 있습니다.

만약 당신이 그것을 잊을 수 있다면 나는 테이블 잠금 아이디어가 최선의 선택이라고 생각한다.