查询挂起

时间:2013-10-30 10:01:56

标签: sql-server transactions locks

此代码正常运行:

CREATE SYNONYM S FOR [ServerIP].[MyDatabase].[dbo].[MyTable]
SELECT * FROM S
DROP SYNONYM S

这个没有用。

BEGIN TRAN              
    CREATE SYNONYM S FOR [ServerIP].[MyDatabase].[dbo].[MyTable]
    SELECT * FROM S
    DROP SYNONYM S
COMMIT TRAN

我在执行SELECT语句时得到了排他锁(request_mode是X),sysschobjs和sysobjvalues上的resource_type = KEY。

任何人都可以解释为什么它会挂掉吗?

P.S。该示例只是对更复杂代码的简化,其中外部事务在调用者SP中调用。

1 个答案:

答案 0 :(得分:0)

我认为问题可能是同义词可以在事务范围之外访问(当前连接也是如此)。 尝试在SSMS中的不同选项卡中运行两组代码。

将会发生的是,另一个标签中的第二个查询将等待10秒,直到第一个查询完成:

-- first tab:
    BEGIN TRAN              
        CREATE SYNONYM S FOR [ServerIP].[MyDatabase].[dbo].[MyTable]
        waitfor delay '00:00:10'
        SELECT * FROM S
        DROP SYNONYM S
    COMMIT TRAN

-- second tab:
BEGIN TRAN              
    CREATE SYNONYM S FOR [ServerIP].[MyDatabase].[dbo].[MyTable]
    SELECT * FROM S
    DROP SYNONYM S
COMMIT TRAN

运行这些查询时,第二个查询将在CREATE语句失败,但随后将从select返回行,并且不会等待事务提交:

-- first tab:
CREATE SYNONYM S FOR [ServerIP].[MyDatabase].[dbo].[MyTable]
waitfor delay '00:00:10'
SELECT * FROM S
DROP SYNONYM S

--second tab:
CREATE SYNONYM S FOR [ServerIP].[MyDatabase].[dbo].[MyTable]
SELECT * FROM S
DROP SYNONYM S

防止多个会话尝试删除并创建相同同义词的可能解决方案:

  1. 不要使用同义词:)
  2. 首先检查同义词是否存在(尽管不能保证 该特定名称的同义词指向右表): if not exists(select * from sys.synonyms where name = 's') create synonym s for [MyDatabase].[dbo].[MyTable]
  3. 创建将由每个实例使用的永久同义词 程序