首页 > 解决方案 > 异步 SQL 过程执行集并等待完成

问题描述

假设我对要运行的过程有大量调用,这些调用具有不同的参数但相互独立,因此我想进行并行/异步调用。我使用服务代理来触发这些,但我遇到的问题是我想知道如何等待它们全部完成(或错误)的巧妙方法。

有没有办法做到这一点?我相信我可以循环等待结果表检查是否完成,但这不是很“事件触发”。希望有更好的方法来做到这一点。

我已经使用了带有队列代码的服务代理,并根据这个其他答案进行处理:Remus' service broker queueing example

标签: tsqlasynchronoussql-server-2016service-broker

解决方案


好日子希夫,

您可以使用多种方法(与往常一样)来实现此要求。其中之一是使用这个逻辑:

(1) 创建两个队列:一个是触发器,用于执行您要异步执行的主 SP,另一个是触发器,在所有执行结束后执行您要执行的任何内容。

(2) 当您在第一个队列中创建消息时,您还应该在第二个队列中创建一个消息,它只会告诉我们哪个执行尚未结束(第一个队列提供自从我们开始执行后开始执行的信息,我们使用该消息并将其从队列中删除)。

(3) 在您使用主第一个队列执行的 SP 内部(这部分同步执行):

(3.1) 执行你需要的查询

(3.2) 从第二个队列中清除等效消息(意味着只有在查询结束后才会删除此消息)

(3.3) 检查第二个队列中是否有消息。如果没有消息,则所有任务都结束了,您可以执行最后一步

** 理论上,您可以将数据存储在表中,而不是使用第二个队列,但使用第二个队列可能会比每次执行结束时更新表提供更好的性能。无论如何,您也可以测试使用表格的选项。


推荐阅读