SQL Server中全局临时表何时被销毁?

5
我对全局临时表的使用感到困惑。我创建了一个全局临时表。
// Session 52:创建者会话
Create Table ##temp(i int) 
Insert Into ##temp(i) Values(1),(2),(3)
Select * From ##temp

//会话 56

Select * From ##temp

//会话57:最后持有##temp引用的会话

Select * From ##temp

现在,如果我关闭Session 52,则##temp表将被销毁。

我认为全局临时表会在以下情况下释放:

  1. 它被任何会话明确删除
  2. 创建者会话关闭,并且没有其他会话引用此会话。

我对引用此会话(创建者会话)的会话感到困惑,这是什么意思?


你如何关闭第52个会话? - ceth
请参考以下链接以更好地了解全局临时表在SQL Server中的使用: https://dev59.com/RlHTa4cB1Zd3GeqPNwGf - knkarthick24
如果“引用此会话的会话”这个词汇是从某个地方获取的 - 因为它似乎使您感到困惑 - 如果您链接到阅读该术语的位置,则会有所帮助。通常术语应该是类似于“引用表的会话”,而不是“会话”。 - Damien_The_Unbeliever
@Damien_The_Unbeliever - Shekhar Dalvi
@Damien_The_Unbeliever,这正是我的理解。如果“sessions referencing the table”是这样的话,那么在“Session 52”关闭后表格不应该被释放,因为“Session 57”仍然引用它。 - Shekhar Dalvi
显示剩余2条评论
2个回答

5
CREATE TABLE中得知:
全局临时表会在创建该表的会话结束并停止引用它们的所有其他任务后自动删除。任务和表之间的关联仅在单个Transact-SQL语句的生命周期内维护。这意味着,当创建该会话结束时,最后一个主动引用该表的Transact-SQL语句完成后,将删除全局临时表。
尽管作为个人挑剔,我会在最后一句中使用after而不是when
因此,根据您的示例,只要会话57实际执行依赖于表的语句,全局临时表就会保留。一旦该语句完成 - 因此会话已移到另一个语句或处于空闲状态 - 全局临时表将被删除。

它不必在积极执行语句。它只需要保持锁定状态。对于比读取提交更高隔离级别的事务(或使用等效提示),这可能是早期执行的语句。 - Martin Smith

3

全局临时表只有在当前用户断开连接并且所有引用它的会话都关闭时才会被销毁。这意味着,除非与用户(会话创建者)相关的所有会话都已关闭,否则全局临时表不会被销毁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接