在单个事务中通过不同连接进行并行查询

时间:2019-01-24 07:52:19

标签: sql-server tedious node-mssql

我有一个方案来实现工作流管理。有一个选项,带有并行网关,可以并行执行两个(或更多)任务分支。该任务实质上意味着一些数据库操作。

问题:

考虑到沙盒执行类型,如果出现任何问题,我需要还原整个过程。因此,所有事情都必须在单个事务下完成。但是当我有几个并行的任务/数据库查询时,它就不合适了。

分析:

因为我正在使用节点池(在node-mssql下使用)进行连接池。因此,对于要开始的事务,我们获取一个连接并在同一连接中运行后续查询。为了使另一个查询并行运行,我们需要池中的另一个连接,该连接不共享第一个连接的事务或资源。

有什么办法可以实现?欢迎任何帮助或讨论。

3 个答案:

答案 0 :(得分:0)

SQL Server中有一个功能,您可以将一个会话绑定到另一个会话,这意味着它们共享相同的事务和锁空间,但是该功能已被弃用,并且可能会在功能中删除。

想法是,您使用sp_getbindtoken从一个会话中获得令牌,然后使用sp_bindsession将另一个会话绑定到该会话。您必须进行一些试验,看看它是否适合您的方案。

上面链接的文档中建议的替代功能为Multiple Active Result Sets (MARS)。同样,您将不得不做一些实验。

答案 1 :(得分:0)

一种方法是在节点侧使用unit of work pattern

不幸的是,我不知道是否存在可以帮助您完成此任务的模块。

答案 2 :(得分:0)

建议的另一种方法是使用分布式事务。 SQL Server支持在分布式事务中注册。因此,您可以将每个数据库任务注册到一个分布式事务中,最后提交\回滚它。

您通常会使用分布式事务处理程序来跨多个事务数据存储区协调事务,但是它也可以与同一个数据库的多个连接一起工作,但是我认为这不是一个好方法。

要执行此操作,您需要一个分散的事务协调器(MSDTC在Windows上执行),并且它变得复杂并且可能会出现性能问题。