我有两个进程,有时同时运行。
第一个是大容量插入
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();
}第二个是从存储过程大容量更新
-存储过程代码的一部分--
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,以便第二个进程等待资源被释放。
发布于 2011-09-23 22:54:23
默认情况下,SqlBulkCopy不使用独占锁,因此,当它执行时,它会执行和插入数据,您的更新过程就会开始,从而导致死锁。为了解决这个问题,您可以指示SqlBulkCopy采取您已经建议的独占表锁,或者您可以将批量插入的批处理大小设置为一个合理的数目。
如果你能逃脱的话,我认为桌子锁的主意是最好的选择。
https://stackoverflow.com/questions/6852906
复制相似问题