Sql server 死锁-SQL Server 2012临时数据库
SQL server代理作业中存在死锁问题。附件是xml_死锁报告 我们有一些在作业中执行的存储过程,我们使用临时表 例如: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
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 <> '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 <> '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造成了死锁,因此它是不同的事务。。。