Sql server 死锁-SQL Server 2012临时数据库

Sql server 死锁-SQL Server 2012临时数据库,sql-server,database-deadlocks,Sql Server,Database Deadlocks,SQL server代理作业中存在死锁问题。附件是xml_死锁报告 我们有一些在作业中执行的存储过程,我们使用临时表 例如: SET @columnsSQL = ' SELECT @columnArrayOut = COALESCE(@columnArrayOut + '','' , '' '' ) ' + CHAR(13) +' + COLUMN_NAME ' + CHAR(13) +'from

SQL server代理作业中存在死锁问题。附件是xml_死锁报告

我们有一些在作业中执行的存储过程,我们使用临时表

例如:

SET @columnsSQL = ' SELECT @columnArrayOut = COALESCE(@columnArrayOut + '','' , '' ''  ) ' + CHAR(13)
                        +' + COLUMN_NAME '  + CHAR(13)
                        +'from tempdb.INFORMATION_SCHEMA.COLUMNS ' + CHAR(13)
                        +' where table_name = '  + CHAR(13)
                        +'  object_name(' + CHAR(13)
                        +'      object_id(''tempdb..'+ @globalTableName +'''),' + CHAR(13)
                        +'      (select database_id from sys.databases where name = ''tempdb''))' + CHAR(13)
                        +'AND COLUMN_NAME <> ''SeqNbr''' + CHAR(13)
                        +'ORDER BY ORDINAL_POSITION '






    SET @sqlScript  = 'INSERT INTO '+ @globalTableName + CHAR(13)
                    + 'SELECT * '+ CHAR(13)
                    + 'FROM ('+ CHAR(13)
                    + 'SELECT '+ @columnArray +', CAST(ROW_NUMBER() OVER(ORDER BY '+ @orderBy +') AS VARCHAR) AS SeqNbr FROM '+ @TableName +' WITH (NOLOCK)'+ CHAR(13)
                    + 'UNION'+ CHAR(13)
                    + 'SELECT '+ @columnArrayHeading +', ''0'''+ CHAR(13)
                    + ') AS Temp'+ CHAR(13)
                    + 'ORDER BY CAST(SeqNbr AS INT)  ASC'+ CHAR(13)

                    + 'SELECT '+ @columnArrayOut +',  CASE convert(INT, SeqNbr) WHEN  0 THEN ''SeqNbr'' ELSE SeqNbr END
                    FROM '+ @globalTableName + CHAR(13)
                    + 'ORDER BY CAST(SeqNbr AS INT) ASC'+ CHAR(13)
                    + 'DROP TABLE '+ @globalTableName;
我想这一定是因为我们需要在一些代码之后添加nolock,我走对了吗

我们在同一个SQL Server实例上有不同的客户,它是SQL Server 2012

 <deadlock>
 <victim-list>
  <victimProcess id="process6ff025c38" />
 </victim-list>
 <process-list>
  <process id="process6ff025c38" taskpriority="0" logused="27564" waitresource="KEY: 2:281474978938880 (6f07e5ef564d)" waittime="3457" ownerId="2943291814" transactionname="ExportFilter" lasttranstarted="2015-12-28T07:15:10.007" XDES="0xdb84ad760" lockMode="S" schedulerid="3" kpid="1536" status="suspended" spid="72" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2015-12-28T07:15:09.980" lastbatchcompleted="2015-12-28T07:15:09.970" lastattention="1900-01-01T00:00:00.970" clientapp="SQLAgent - TSQL JobStep (Job 0x93F327E5D307B843A95C7883AEE52C41 : Step 2)"  isolationlevel="read committed (2)" xactid="2943291814" currentdb="9" lockTimeout="4294967295" clientoption1="538968096" clientoption2="128056">
   <executionStack>
    <frame procname="adhoc" line="1" stmtstart="78" sqlhandle="0x02000000bdb8ee370644f54bc076833c46eb8ce8ae6c21370000000000000000000000000000000000000000">
SELECT @columnArrayOut = COALESCE(@columnArrayOut + ',' , ' '  ) 
 + COLUMN_NAME 
from tempdb.INFORMATION_SCHEMA.COLUMNS 
 where table_name = 
    object_name(
        object_id('tempdb..##w_xxx004718_2328_MG_SO'),
        (select database_id from sys.databases where name = 'tempdb'))
AND COLUMN_NAME &lt;&gt; 'SeqNbr'
ORDER BY ORDINAL_POSITION    </frame>
    <frame procname="mssqlsystemresource.sys.sp_executesql" line="1" stmtstart="-1" sqlhandle="0x0400ff7f427f99d9010000000000000000000000000000000000000000000000000000000000000000000000">
sp_executesql    </frame>

  isolationlevel="read committed (2)" 
         <frame procname="adhoc" line="1" stmtstart="78" sqlhandle="0x020000006df5ee06624475cdc854f45d0579dd554dddd61c0000000000000000000000000000000000000000">
    SELECT @columnArrayOut = COALESCE(@columnArrayOut + ',' , ' '  ) 
     + COLUMN_NAME 
    from tempdb.INFORMATION_SCHEMA.COLUMNS 
     where table_name = 
        object_name(
            object_id('tempdb..##w_xxx050820_2164_MG_LO'),
            (select database_id from sys.databases where name = 'tempdb'))
    AND COLUMN_NAME &lt;&gt; 'SeqNbr'
    ORDER BY ORDINAL_POSITION    </frame>
        <frame procname="mssqlsystemresource.sys.sp_executesql" line="1" stmtstart="-1" sqlhandle="0x0400ff7f427f99d9010000000000000000000000000000000000000000000000000000000000000000000000">
    sp_executesql    </frame>

    <resource-list>
    <keylock hobtid="281474978938880" dbid="2" objectname="tempdb.sys.sysschobjs" indexname="clst" id="lock15895c380" mode="X" associatedObjectId="281474978938880">
       <owner-list>
        <owner id="processea1d7ecf8" mode="X" />
       </owner-list>
       <waiter-list>
        <waiter id="process6ff025c38" mode="S" requestType="wait" />
       </waiter-list>
      </keylock>
      <keylock hobtid="281474978938880" dbid="2" objectname="tempdb.sys.sysschobjs" indexname="clst" id="lock375a18480" mode="X" associatedObjectId="281474978938880">
       <owner-list>
        <owner id="process6ff025c38" mode="X" />
       </owner-list>
       <waiter-list>
        <waiter id="processea1d7ecf8" mode="S" requestType="wait" />
       </waiter-list>
      </keylock>
     </resource-list>
    </deadlock>

您能否更改代码,使其在创建tempdb中的对象时,不会在同一事务中尝试从tempdb系统表中读取数据?nolock可能会有所帮助,但我经常发现它在系统视图中不起作用。当然元数据函数会忽略它。我想我们现在不会修改代码。有没有其他快速解决方法?我是否可以使用另一个隔离级别来解决此问题?您的代码将使用object_id和object_name,因此没有其他解决方案解决此问题?是两个不同的SPID:s造成了死锁,因此它是不同的事务。。。