SQL Server存储过程:它们是否排队?

Val*_*rie 4 sql t-sql sql-server stored-procedures

我应该能够找到答案,但我的谷歌今天很弱.当我通过Web应用程序多次调用相同的存储过程时,是否排队呼叫或者它们是否独立运行?

wom*_*omp 9

取决于存储过程正在执行的操作的隔离级别.如果对SP中的所有事务的隔离级别设置为READ UNCOMMITTED,则没有保护,并且多个线程可以同时执行同一事务.

如果将其设置为更高的隔离级别,则其他线程可能会被锁定在SP正在处理的资源之外,直到事务完成,从而有效地"排队"其他SP线程.

但是没有明确的存储过程队列.只要您的数据库具有可用的空闲连接和资源,它就会生成线程以满足请求.


Rem*_*anu 5

都.每次调用存储过程(更准确地说,客户端发送的每个请求)都会在SQL中创建一个可见的任务sys.dm_os_tasks.任务被分配给schedulers(sys.dm_os_schedulers)并等待worker(sys.dm_os_workers)可用于运行它们.如果系统非常繁忙,那么任务排队,这在work_queue_count列中可见sys.dm_os_schedulers.有关详细信息,请参阅线程和任务架构.

在正常操作下,尽管排队效果不可见,因为系统会立即获取提交的任务并开始运行它们.

客户端每个连接只能提交一个请求(MARS是例外,不是规则).因此,从客户端的角度来看,他必须在使用连接时对请求进行排队,但这在程序控制流中是隐藏的(即,它必须等待请求在提交新请求之前返回).