我应该能够找到答案,但我的谷歌今天很弱。当我通过Web应用程序多次调用相同的存储过程时,是否排队呼叫或者它们是否独立运行?
答案 0 :(得分:8)
取决于存储过程正在执行的isolation level。如果对SP中的所有事务的隔离级别设置为READ UNCOMMITTED,则没有保护,并且多个线程可以同时执行同一事务。
如果它被设置为更高的隔离级别,那么在事务完成之前,其他线程可能会被锁定在SP正在处理的资源之外,从而有效地“排队”其他SP线程。
但是没有显式存储过程队列。只要您的数据库具有可用的空闲连接和资源,它就会生成线程以满足请求。
答案 1 :(得分:5)
两者。每次调用存储过程(更准确地说,客户端发送的每个请求)都会在SQL中创建一个任务,在sys.dm_os_tasks
中可见。任务分配给调度程序(sys.dm_os_schedulers
)并等待工作人员(sys.dm_os_workers
)可用于运行它们。如果系统非常繁忙,则将排队,这在work_queue_count
的{{1}}列中可见。有关详细信息,请参阅Thread and Task Architecture。
在正常操作下虽然排队效果不可见,因为系统会立即获取提交的任务并开始运行它们。
客户端每个连接只能提交一个请求(MARS是例外,而不是规则)。因此,从客户端的角度来看,他必须在使用连接时对请求进行排队,但这在程序控制流中是隐藏的(即,它必须等待请求在提交新请求之前返回)。
答案 2 :(得分:0)
他们将独立运作。如果他们排队等候,那么如果你有一个使用大量存储过程的繁忙系统会导致一些大规模的可扩展性问题。
这当然假设sprocs没有锁定资源的方式导致一个调用必须等待另一个调用完成。