当在 a 中使用多个选择时,是单独处理UNION/UNION ALL
每个单独SELECT
语句的表锁,还是持有所有表锁直到所有SELECT
语句完成?
例如,100 个单独的 select 语句通过 连接在一起UNION/UNION ALL
。(假设它们是按顺序解析的)如果事务中的第一个SELECT
事务已完成,而不同会话中的另一个事务试图访问相同的数据,数据是否仍被锁定UNION
?
我只是想了解在UNIONs
物理表仍在执行时它们的行为方式。
UNION
对于提示此问题的查询, (Not UNION ALL
)中有 7 个不同的语句。对于这个特定的问题,我只是想了解其UNION/UNION ALL
工作原理的后端架构。提示这个问题的查询会导致很多阻塞,但只运行了大约一分钟,所以我试图了解是整个查询导致了它还是只是几个单独的部分。
我在这里添加了一个后续问题:Backend Table/Row Locking Structure using CTE Queries
所有
select .. union .. select ..
位都算作一个语句。我在文档中找不到文章来证明这一点,但我可以提供支持证据。首先,分号是Transact-SQL 语句的终止符。您的查询中只有一个地方会被接受,那就是最后一个
SELECT
. 其次,执行计划由一棵树组成,表示一条语句。相反,作为单个批次提交的两个查询将导致两个不相交的执行树。如果存在显式事务,则 the
select..union
成为该事务的一部分,并且锁会一直保持到COMMIT
orROLLBACK
。如果你有一个隐式事务,我的意思是自动提交,而不是SET IMPLICIT_TRANSACTIONS
,它跨越所有的选择。锁定将被保留多长时间,无论它们在UNION
没有TABLOCKX
.