【问题标题】:Temporary table in multithread多线程中的临时表
【发布时间】:2010-12-15 14:50:20
【问题描述】:

我有一个多线程应用程序。

每个线程都执行我在其中创建本地临时表的存储过程。 临时表名称相同:#TempTable

当他们操纵这个#TempTable时,我在线程之间发生了冲突

如何为每个同名的线程创建一个#TempTable

【问题讨论】:

    标签: sql-server multithreading temp-tables


    【解决方案1】:

    您需要确保每个线程在与连接池不同的连接中运行(因此它在不同的会话中)。

    临时表只在它们自己的会话中可见。

    来自MSDN

    本地临时表只在当前会话中可见

    【讨论】:

    • 我想避免事务,因为我操作的数据量很大(大数据插入 => 撤消太长)
    • @Patrice Pezillier - 您需要为每个线程使用不同的连接
    • 啊---你可以做很多事情,避免交易是不可能的。总有一笔交易。您可以在每次插入或两次插入后提交,但原子操作仍然是 sql serer 的一部分。
    • 我可以为每个线程创建一个不同名称的临时表吗?我需要一个存储过程,它在参数中采用临时表的名称...有可能吗?
    • @Patrice - 重新传递临时表的名称 - 你真的不想这样做,因为你最终不得不将动态 SQL 添加到已经听起来很复杂的东西中。
    【解决方案2】:

    只要多个线程使用单独的连接(我真的希望它们是这样,否则多线程可能没有任何好处,或者您的代码中隐藏着大量竞争条件),它们都应该有自己的副本临时表。你不应该做任何其他事情。

    【讨论】:

      【解决方案3】:

      #TempTable temporary table 应该只对当前 SQL 服务器会话/连接可用,因此如果您希望每个进程都有一个单独的 #TempTable,只需为每个进程使用单独的连接。 如果这不可行,您可以使用表变量,这在某种程度上是常规表和变量之间的交叉 - 像这样:

      DECLARE @TableVar TABLE (
        IDColumn int,
        NameColumn varchar(max))
      
      INSERT INTO @TableVar (IDColumn, NameColumn)
      SELECT  ID, Name
      FROM    RealTable
      WHERE   .....
      

      但是,如果您希望所有进程都使用同一张表,只需使用双哈希 (##TempTable) 命名它,然后它就可以全局访问。

      【讨论】:

      • 看来我回答错了问题:),编辑回复以匹配
      猜你喜欢
      • 1970-01-01
      • 2010-10-02
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      相关资源
      最近更新 更多