【问题标题】:Asynchronous SQL procedure execution set and wait for completion异步 SQL 过程执行集并等待完成
【发布时间】:2018-08-01 05:23:50
【问题描述】:

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

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

我已根据其他答案使用了带有队列代码和处理的服务代理:Remus' service broker queuing example

【问题讨论】:

    标签: tsql asynchronous sql-server-2016 service-broker


    【解决方案1】:

    晚安,希夫,

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

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

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

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

    (3.1) 执行你需要的查询

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

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

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

    【讨论】:

    • > (3.3) 检查第二个队列中是否有消息。如果没有消息,则所有任务都结束了,您可以执行最后一步当您这么说时,这就是我的问题的核心 - 您用于此检查的机制?
    • 在上面的逻辑中,您检查由第一个主队列触发的同一个存储过程 (SP) 中的第二个队列。它是包含您的主要查询的事务的一部分(这就是为什么步骤 3.1 - 3.3 不是新步骤而是步骤 3 的一部分)。我从您的描述中假设您知道如何使用队列和消息,因为您描述了您知道如何使用服务代理来异步执行查询。您的意思是您不知道如何检查队列是否为空或您还不清楚逻辑吗?
    • 我想我了解工作流程是什么。 (3.3) 听起来像是一个潜在的竞争条件 - 如果说最后两个排队的项目同时完成,有可能多次处理“最后一步”?
    • 我遇到的另一个问题是我希望主线程继续执行,而不是从第二个队列处理器继续执行主脚本。
    • 关于第一点,这是您应该在最后一步中介绍的内容。例如,如果在最后一步创建表,则首先检查表是否存在。您没有向我们提供任何真实信息,仅提供故事,仅导致一般理论讨论!如果您想要特定的解决方案,那么我们需要重现相关场景,这意味着您需要提供查询来创建所有相关元素(表、插入示例数据、当前服务代理、MESSAGE 类型、CONTRACT 等等......它好像你得到了理论答案并且你理解了步骤
    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 2020-10-04
    • 2010-10-11
    • 1970-01-01
    • 2019-05-31
    • 2021-12-10
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多