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]创建同义词
创建一个永久同义词,该同义词将由
程序
谢谢你的重播。你有没有看到避免锁的方法?