SQL Server线程中的本地临时表是否安全?

时间:2015-07-23 18:26:12

标签: sql-server tsql

我甚至在堆栈上看到了混合答案,并希望找到明确的答案。对内部创建本地临时表的同一存储过程的多个并行调用是否会使用入站参数相互冲突?基本上是本地临时表或任何风格的临时表线程安全。

谢谢!

2 个答案:

答案 0 :(得分:2)

临时表与会话相关,您无法在同一会话中创建相同的临时表。举个例子:

在会话中创建临时表

CREATE TABLE #ThreadSafeTable
(
  Id INT IDENTITY(1,1), 
  SomeColumn VARCHAR(20)
)

现在,当您尝试在其他会话中创建相同的临时表时,SQL Server将为其指定一个不同的名称。在系统数据库中检查相同> Tempdb>临时表

enter image description here

因此,只要每个线程在不同的会话中运行,您就不会遇到排序问题,我总是建议这样做。 。 对于范围为" Sever"的全局临时表,情况不同。

修改-1

测试具有相同临时表的存储过程是否不会相互冲突

创建以下存储过程

  CREATE PROCEDURE dbo.MyTestSP
AS
BEGIN TRY
    CREATE TABLE #ThreadSafeTable
(
  Id INT IDENTITY(1,1), 
  SomeColumn INT
)

INSERT INTO #ThreadSafeTable
VALUES (FLOOR(RAND()*(25-1)+1)),(CAST(FLOOR(RAND()*(25-1)+1) AS Varchar(20)))

SELECT *, Session_ID = @@SPID FROM #ThreadSafeTable

WAITFOR DELAY '00:00:10'

DROP TABLE #ThreadSafeTable
END TRY
BEGIN CATCH
        DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();
        RAISERROR (@ErrorMessage, @ErrorSeverity,@ErrorState);
END CATCH

以上sp将创建相同的SP,但会向其填充随机数据。现在,在一个窗口或不同的窗口中多次执行此SP

enter image description here

答案 1 :(得分:1)

线程安全与它有什么关系。如果它是本地临时值,那么它是该存储过程的本地。如果您没有终止本地临时表,它仍然只能用于该连接。

想一想。如果它们都使用相同的本地临时值,那么如果它是一个常见的本地临时值,则创建本地temp的调用将失败。