小编Ioa*_*n H的帖子

MS SQL Server - 安全并发使用全局临时表?

在MS SQL Server中,我使用全局临时表来存储客户端传递的会话相关信息,然后在触发器中使用该信息.

由于同一个全局临时表可以在不同的会话中使用,当我想写入它时可能存在也可能不存在(取决于之前使用它的所有先前会话是否都已关闭),我正在检查基于我在写入之前创建的全局临时表存在.

IF OBJECT_ID('tempdb..##VTT_CONTEXT_INFO_USER_TASK') IS NULL
  CREATE TABLE ##VTT_CONTEXT_INFO_USER_TASK (
    session_id    smallint,
    login_time    datetime,
    HstryUserName VDT_USERNAME,
    HstryTaskName VDT_TASKNAME,
  )

MERGE ##VTT_CONTEXT_INFO_USER_TASK As target
USING (SELECT @@SPID, @HstryUserName, @HstryTaskName) as source (session_id, HstryUserName, HstryTaskName)
ON (target.session_id = source.session_id)
WHEN MATCHED THEN
  UPDATE SET HstryUserName = source.HstryUserName, HstryTaskName = source.HstryTaskName
WHEN NOT MATCHED THEN
  INSERT VALUES (@@SPID, @LoginTime, source.HstryUserName, source.HstryTaskName);
Run Code Online (Sandbox Code Playgroud)

问题是,在检查表存在和MERGE语句之间,如果之前使用它的所有会话碰巧在该确切的实例中关闭,SQL Server可能会删除临时表(这实际上发生在我的测试中).

是否有关于如何避免这种并发问题的最佳实践,在检查它的存在与其后续使用之间不会删除表?

sql-server concurrency session race-condition global-temp-tables

5
推荐指数
1
解决办法
383
查看次数