SQLSERVER - LOCK错误

时间:2016-06-23 10:51:59

标签: sql-server sql-server-2008

我在运行proc时遇到错误。通过SSIS .. 错误:

  

[执行SQL任务]错误:执行查询"执行clk.id_Process?   ,? &#34?;失败并出现以下错误:" SQL的实例   Server Database Engine此时无法获取LOCK资源。   当活跃用户较少时,重新运行您的语句。咨询   数据库管理员检查锁和内存配置   这个实例,或检查长时间运行的事务。"。可能   失败原因:查询问题," ResultSet"财产没有设定   正确,参数设置不正确,或连接未建立   正确。

我试图通过加入

来追查问题
"sys.dm_exec_sessions AS s
INNER JOIN sys.dm_exec_requests AS r ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st"

发现它在更新表时受到了攻击

UPDATE ta        
        SET ta.id =
        CASE 
            WHEN ta.id=tmp.MergeoldId THEN tmp.MergenewId
            ELSE ta.id
        END,
        ta.Id2=
        CASE
         WHEN ta.Id2=tmp.MergeoldId THEN tmp.MergenewId
         ELSE ta.Id2
        END,
        ta.Id3=
        CASE
            WHEN ta.Id3=tmp.MergeoldId THEN tmp.MergenewId
            ELSE ta.Id3
        END
        --SELECT ta.id ,ta.Id2,ta.Id3, tmp.MergeoldId,*
        FROM tel.TranAssemble ta WITH (ROWLOCK)
        INNER JOIN clk.id_Process tmp WITH (NOLOCK) on (ta.id = tmp.MergeoldId OR ta.Id2=tmp.MergeoldId OR ta.Id3=tmp.MergeoldId )
        WHERE tmp.Id >= @MinId AND tmp.Id < @MINID +  @BatchSize

任何解决方案?

1 个答案:

答案 0 :(得分:1)

这个问题是由于记忆压力,因为The lock manager will not use more than 60 percent of the memory available to SQL Server

  

SQL Server无法获取锁资源。这可能是由以下原因引起的:
  SQL Server无法从操作系统分配更多内存,因为其他进程正在使用它,或者因为服务器在配置了max server memory选项的情况下运行。   锁管理器不会使用超过60%的SQL Server可用内存。

正常情况下,SQL服务器对所有查询(甚至选择)使用锁定,并且每个锁定使用少量内存(96字节)。

根据以上知识,您可以使用以下查询开始排查问题

--this gives you currently running queries holding more locks
select * from sys.dm_exec_requests ec
cross apply
(SELECT request_session_id, COUNT (*) num_locks
FROM sys.dm_tran_locks trn
where ec.session_id=trn.request_session_id
GROUP BY request_session_id 
)b

--this gives you locks for allsessions
SELECT request_session_id, COUNT (*) num_locks
FROM sys.dm_tran_locks trn
where ec.session_id=trn.request_session_id
GROUP BY request_session_id