Asp.net mvc SQL Server:在存储过程中使用临时表时的并发性
我在IIS服务器上发布了一个ASP.NET MVC应用程序。我在这里使用web园艺,我的意思是,应用程序池有多个工作进程来处理传入的请求。这个应用程序也被很多用户和客户使用 此应用程序调用使用一些本地临时表的SP(例如)。例如:Asp.net mvc SQL Server:在存储过程中使用临时表时的并发性,asp.net-mvc,sql-server-2008,asp.net-mvc-4,iis,web-garden,Asp.net Mvc,Sql Server 2008,Asp.net Mvc 4,Iis,Web Garden,我在IIS服务器上发布了一个ASP.NET MVC应用程序。我在这里使用web园艺,我的意思是,应用程序池有多个工作进程来处理传入的请求。这个应用程序也被很多用户和客户使用 此应用程序调用使用一些本地临时表的SP(例如)。例如: BEGIN if OBJECT_ID(N'tempdb..#MyTempTable') IS NOT NULL BEGIN DROP TABLE #MyTempTable END CREATE TABLE #MyTempTable ( someField
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服务器)中,使用线程处理请求。每个请求将在应用程序池中创建的新线程中执行。除非共享资源,否则线程不会相互影响
本地临时对象由会话分隔。如果有两个查询同时运行,那么它们显然是两个完全独立的会话,您无需担心。登录不重要。如果您正在使用连接池,这也不重要。本地临时对象(通常是表,也包括存储过程)不会被其他会话看到
即使多个线程(也包括请求)希望使用一个连接并执行存储过程,连接池也不能重用同一个连接。这意味着没有危险
类似地,一个线程使用连接并执行存储过程,它将不起作用。所有调用都使用相同的存储过程。它们将按顺序排队,直到执行上一个调用。Temp表是它们所创建的作用域的本地表,当它们超出作用域时会自动删除(您不需要在过程结束时进行
删除
)。本地临时表不会与其他会话冲突。大量使用临时表的唯一并发问题是从DBA的角度来看,多个临时数据库文件可以减少分配页争用。顺便说一句,SQL 2008不受支持,并且在更高版本中有性能改进,例如临时表元数据缓存。