Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 两个相等的INSERT查询之间的同一个密钥上的死锁_Sql_Sql Server - Fatal编程技术网

Sql 两个相等的INSERT查询之间的同一个密钥上的死锁

Sql 两个相等的INSERT查询之间的同一个密钥上的死锁,sql,sql-server,Sql,Sql Server,我们有一个插入查询: INSERT INTO dbo.AnotherTable (CorrespondenceRecordKey, FeedbackFileDataKey, FeedbackRecordStatusCode, RecordLevelErrorCode, ActivityPeriodKey, SwiftNessHandlerId, LastProcessStatusCode, LastProcessStatusDate, Re

我们有一个插入查询:

INSERT INTO dbo.AnotherTable    
(CorrespondenceRecordKey,
FeedbackFileDataKey,
FeedbackRecordStatusCode,
RecordLevelErrorCode,   
ActivityPeriodKey,
SwiftNessHandlerId,                 
LastProcessStatusCode,  
LastProcessStatusDate,  
RecordGUID, 
IsLastAnswer,   
GeneralFileDataXMLKey,  
RowReference)

OUTPUT

INSERTED.RecordKey,
INSERTED.CorrespondenceRecordKey,
INSERTED.FeedbackFileDataKey,
INSERTED.FeedbackRecordStatusCode,
INSERTED.RecordLevelErrorCode,
INSERTED.ActivityPeriodKey,
INSERTED.CorrespondenceCRMID,
INSERTED.CorrespondenceSyncKey,
INSERTED.SwiftNessHandlerId,
INSERTED.LastProcessStatusCode,
INSERTED.LastProcessStatusDate,
INSERTED.RecordGUID,
INSERTED.IsLastAnswer,
INSERTED.GeneralFileDataXMLKey,
INSERTED.RowReference 

INTO #Temp3

SELECT

NRFC.RecordKey AS CorrespondenceRecordKey,
SomeTable.RecordKey AS FeedbackFileDataKey,
fid.FeedbackRecordStatusCode,
fid.RecordLevelErrorCode,
fid.ActivityPeriodKey,
fid.SwiftNessHandlerId,
fid.LastProcessStatusCode,
fid.LastProcessStatusDate,
fid.RecordGUID,
fid.IsLastAnswer,
fid.GeneralFileDataXMLKey,
fid.RowReference

FROM #Temp1 fid
INNER JOIN #Temp2 NRFC 
    ON NRFC.RecordGUID = fid.CorrespondenceRecordGUID
INNER JOIN dbo.SomeTable 
    ON SomeTable.RecordGUID = fid.FeedbackFileDataGUID;
插入
是艰苦工作程序的一部分。该过程在并行线程中工作

我们在
SomeTable(RecordKey)
上有
聚集索引
,在
SomeTable.RecordGUID上有
非聚集索引
。执行计划显示
非聚集索引的用法

至少我们在两个相等的
插入之间的
非聚集索引
上得到了
死锁
。inserts询问
非聚集索引上的S型锁和X型锁,问题如下:

  • 为什么会出现X型锁
  • 为什么会出现死锁
  • 我怎样才能战胜它

  • 每当SQL Server插入/更新行时,都会发生Xtype锁。如果进程A锁定资源1并等待资源2(在事务上下文中),而进程B在等待资源1时锁定资源2,则会发生死锁(与简单锁定非常不同)


    SQLServer将检测到这一点,并杀死做了最少工作的进程,让另一个进程完成事务。解决这一问题的最简单方法是以相同的顺序访问资源——任何进程获得资源1的方式都会阻止另一个进程启动,第一个资源将完成,释放所有资源,然后第二个进程可以完成它必须做的事情

    谢谢。但我们处于另一种情况。没有从已锁定的表中插入、更新或删除任何内容。进程的顺序与其说是完全相同,不如说是完全相同:)我可以理解它是否可以是共享锁,因为内部连接比这更重要,让我们假设X类型锁可以被理解(但它不会)。我无法理解死锁…欢迎来到堆栈溢出!我编辑了你问题的标签,以包含相关标签,这样更多了解该主题的人会看到它。我还改进了格式,以提高可读性-有关编辑问题的更多信息,请参阅。祝你好运