首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新- DeadLock问题

更新- DeadLock问题
EN

Stack Overflow用户
提问于 2011-07-28 00:35:28
回答 1查看 1.4K关注 0票数 0

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

第一个是大容量插入

代码语言:javascript
复制
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();
            }

第二个是从存储过程大容量更新

-存储过程代码的一部分--

代码语言:javascript
复制
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,以便第二个进程等待资源被释放。

EN

回答 1

Stack Overflow用户

发布于 2011-09-23 22:54:23

默认情况下,SqlBulkCopy不使用独占锁,因此,当它执行时,它会执行和插入数据,您的更新过程就会开始,从而导致死锁。为了解决这个问题,您可以指示SqlBulkCopy采取您已经建议的独占表锁,或者您可以将批量插入的批处理大小设置为一个合理的数目。

如果你能逃脱的话,我认为桌子锁的主意是最好的选择。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6852906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档