【问题标题】:SQL Server: Concurrency when using temporary tables within stored proceduresSQL Server:在存储过程中使用临时表时的并发性
【发布时间】:2021-01-05 05:09:47
【问题描述】:

我在 IIS 服务器上发布了一个 ASP.NET MVC 应用程序。我在这里使用网络园艺,我的意思是,应用程序池有多个工作进程来处理传入的请求。这个应用程序也被很多用户客户使用。

此应用调用使用一些本地临时表的 SP(#example)。举个例子:

BEGIN

if OBJECT_ID(N'tempdb..#MyTempTable') IS NOT NULL
BEGIN
  DROP TABLE #MyTempTable
END

CREATE TABLE #MyTempTable
(
   someField int,
   someFieldMore nvarchar(50)
)

... Use of temp table here
... And then drop table again at the end..

DROP TABLE #MyTempTable

END

我担心并发性,例如,如果用户客户端调用存储过程而另一个先前的调用同时运行会发生什么?这里可能是并发问题吗?

【问题讨论】:

  • 临时表在它们创建的范围内是本地的,当它们超出范围时会自动删除(您不需要在过程末尾的DROP)。本地临时表不会与其他会话冲突。大量使用临时表的唯一并发问题是从 DBA 的角度来看,其中多个 tempdb 文件可以减少分配页面争用。顺便说一句,SQL 2008 不受支持,并且在以后的版本中有性能改进,例如临时表元数据缓存。

标签: asp.net-mvc sql-server-2008 asp.net-mvc-4 iis web-garden


【解决方案1】:

在 IIS(包括大多数 Web 服务器)中,使用线程来处理请求。每个请求都将在应用程序池中创建的新线程中执行。除非共享资源,否则线程之间不会相互影响。

本地临时对象由 Session 分隔。如果您有两个查询同时运行,那么它们显然是两个完全独立的会话,您无需担心。登录无关紧要。如果您使用的是连接池,那也没关系。本地临时对象(最常见的是表,但也包括存储过程)不会被其他会话看到。

即使是多个线程(也包括请求)想要使用一个连接并执行存储过程,同一个连接也不能被连接池重用。这意味着没有危险。 Explained in this thread.

同样地,一个线程使用连接并执行存储过程,它不会有效果。所有调用都使用相同的存储过程。它们将按顺序排队,直到执行上一个调用。

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多