问题描述
我有一个在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.
类似地,一个线程使用该连接并执行存储过程,它将无效。所有调用都使用相同的存储过程。它们将按顺序排队,直到执行上一个调用为止。