Sql server 查询挂起

Sql server 查询挂起,sql-server,transactions,locks,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

此代码正在运行:

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语句请求时获得独占锁,模式为X,资源类型=sysschobjs和sysobjvalues上的键

有人能解释为什么它会挂在外面吗


另外,该示例只是一个更复杂代码的简化,其中外部事务在调用方SP中调用。

我认为问题可能是同义词也可以在事务和当前连接范围之外访问。 尝试在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
防止多个会话尝试删除和创建同一同义词的可能解决方案:

不要使用同义词: 首先检查同义词是否存在,尽管不能保证 该特定名称的同义词指向右表: 如果不存在,请从sys.synonyms中选择*,其中name='s'为[MyDatabase].[dbo].[MyTable]创建同义词 创建一个永久同义词,该同义词将由 程序
谢谢你的重播。你有没有看到避免锁的方法?