此代码正常运行:
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中调用。
答案 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
防止多个会话尝试删除并创建相同同义词的可能解决方案:
if not exists(select * from sys.synonyms where name = 's') create synonym s for [MyDatabase].[dbo].[MyTable]