0

我有两个有时同时运行的进程。

第一个是批量插入

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让第二个进程等到资源被释放。

4

1 回答 1

2

默认情况下,SqlBulkCopy 不采用独占锁,因此在执行此操作并插入数据时,您的更新过程会启动,从而导致死锁。要解决这个问题,您可以指示 SqlBulkCopy 采用您已经建议的排他表锁,或者您可以将批量插入的批量大小设置为合理的数字。

如果你能摆脱它,我认为表锁的想法是最好的选择。

于 2011-09-23T22:54:23.367 回答