【发布时间】:2009-09-23 17:03:25
【问题描述】:
我应该能够找到答案,但我的 Google-fu 今天很弱。当我有一个 Web 应用程序多次调用同一个存储过程时,这些调用是排队还是独立运行?
【问题讨论】:
标签: sql sql-server tsql stored-procedures
我应该能够找到答案,但我的 Google-fu 今天很弱。当我有一个 Web 应用程序多次调用同一个存储过程时,这些调用是排队还是独立运行?
【问题讨论】:
标签: sql sql-server tsql stored-procedures
取决于存储过程正在做什么的isolation level。如果SP中所有事务的隔离级别都设置为READ UNCOMMITTED,则没有保护,多个线程可以同时执行同一个事务。
如果将其设置为更高的隔离级别,那么其他线程可能会被锁定在您的 SP 正在处理的资源之外,直到事务完成,从而有效地“排队”其他 SP 线程。
虽然没有显式存储过程队列。只要您的数据库有可用的连接和资源,它就会产生线程来满足请求。
【讨论】:
两者兼而有之。存储过程的每次调用(更准确地说是客户端发送的每个请求)都会在 SQL 中创建一个任务,在 sys.dm_os_tasks 中可见。任务被分配给调度程序 (sys.dm_os_schedulers) 并等待工作人员 (sys.dm_os_workers) 可以运行它们。如果系统非常繁忙,那么任务将排队,这在sys.dm_os_schedulers 的work_queue_count 列中可见。更多详情请见Thread and Task Architecture。
在正常操作下,排队的效果是不可见的,因为系统会立即拿起提交的任务并开始运行它们。
客户端每个连接只能提交一个请求(MARS 是例外,而不是规则)。所以从客户端的角度来看,他必须在使用连接时对请求进行排队,但这隐藏在程序控制流中(即它必须等待请求返回才能提交新请求)。
【讨论】:
他们将独立运行。如果他们排队,如果您有一个使用大量存储过程的繁忙系统,这将导致一些大规模的可伸缩性问题。
这当然假设存储过程不会以一种会导致一个调用必须等待另一个调用完成的方式锁定资源。
【讨论】: