SQL Server:在存储过程中使用临时表时的并发性

问题描述

我有一个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

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

解决方法

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

本地临时对象由会话分隔。如果您有两个查询同时运行,那么它们显然是两个完全独立的会话,您无需担心。登录无所谓。而且,如果您正在使用连接池,那也没有关系。本地临时对象(最常用的表,也是存储过程)可以防止其他会话看到。

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

类似地,一个线程使用该连接并执行存储过程,它将无效。所有调用都使用相同的存储过程。它们将按顺序排队,直到执行上一个调用为止。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...