-1

一段时间后,我的 SQL Server 2012 数据库出现了奇怪的行为。一些查询不会运行,包含简单选择的查询。对 ALTER PROCEDURES 的查询也不会运行(它们执行然后卡在执行中,直到我取消它们)。

我运行了一种方法来查看哪些表被锁定,我看到的唯一一个是:

sysobjvalues KEY (ec05837cd075) S 共享

一旦我重新启动 SQL Server 服务,这种情况就会稳定下来。

数据库中的某些表允许 SELECT,而有些则不允许。我虽然这是由于一些锁,但是查看锁的查询不会显示我的任何数据库表都被锁定。什么可能导致这种奇怪的行为?

顺便说一句:这是我运行以获取锁信息的查询:

    选择  
        object_name(P.object_id) 作为表名
        , 资源类型
        , 资源描述
        , 请求模式
        , 案例请求模式
                        当'S'然后'共享'
                        当'你'然后'更新'
                        当“X”时“独家”
                        当'是'然后'意图共享'
                        当'IU'然后'意图更新'
                        当'IX' THEN 'Intent Exclusive'
                        当“SIU”时“共享意图更新”
                        当“六”时“共享意图排他”
                        WHEN 'UIX' THEN 'Update Intent Exclusive'
                        当'BU'然后'批量更新'
                        WHEN 'RangeS_S' THEN '共享范围 S'
                        WHEN 'RangeS_U' THEN '共享范围 U'
                        当'RangeI_N'然后'插入范围'
                        WHEN 'RangeI_S' THEN '插入范围 S'
                        WHEN 'RangeI_U' THEN '插入范围 U'
                        WHEN 'RangeI_X' THEN '插入范围 X'
                        WHEN 'RangeX_S' THEN '专属范围 S'
                        WHEN 'RangeX_U' THEN '专属范围 U'
                        WHEN 'RangeX_X' THEN '专属范围 X'
                        当'SCH-M'然后'模式修改'
                        当'SCH-S'然后'模式稳定性'

            否则为空
            以 REQUEST_LOCK_MODE 结束

    FROM sys.dm_tran_locks AS L
           加入 sys.partitions AS P
            在 L.resource_associated_entity_id = p.hobt_id

谢谢

4

1 回答 1

4

这听起来像阻塞。

当您遇到这种情况时,请在 Management Studio 的状态栏中查找查询挂起的查询窗口。它将在您的用户名后面的括号中,例如:

DOMAIN\Username (spid)
-----------------^^^^ this will be a number

现在,从括号中取出那个数字,然后打开另一个窗口。在第二个窗口中,运行以下命令:

SELECT blocking_session_id, wait_type 
  FROM sys.dm_exec_requests
  WHERE session_id = <SPID from above>;

如果会话出现在blocking_session_id 中,找出他们是谁以及他们在做什么。

SELECT * 
  FROM sys.dm_exec_requests
  WHERE session_id = <blocking_session_id from above>;

DBCC INPUTBUFFER(<that blocking_session_id>);

您还可以检查数据库是否有任何尚未回滚或提交的旧事务,这可能会导致问题:

DBCC OPENTRAN();
于 2013-09-04T20:40:26.447 回答