Параллельные запросы по разным соединениям в одной транзакции

У меня есть сценарий для реализации управления рабочим процессом. Есть вариант, при параллельном шлюзе две (или более) ветки задач могут выполняться параллельно. Задача по сути означает некоторую операцию с БД.

Проблема:

Учитывая тип выполнения песочницы, мне нужно отменить все это, если что-то пойдет не так. Поэтому все должно быть сделано в рамках одной транзакции. Но это не подходит, когда у меня есть пара параллельных запросов task/db.

Анализ:

Поскольку я использую пул узлов (используемый в node-mssql) для пула соединений. Таким образом, для запуска транзакции мы получаем одно соединение и запускаем последующие запросы в том же. Чтобы другой запрос выполнялся параллельно, нам нужно другое соединение из пула, которое не использует транзакцию или ресурс первого соединения.

Есть ли способ сделать это? Приветствуется любая помощь или обсуждение.


person Gautam Kumar Samal    schedule 24.01.2019    source источник


Ответы (3)


В SQL Server есть функция, с помощью которой вы можете привязать сеанс к другому, и это означает, что они используют одно и то же пространство транзакций и блокировок, но эта функция устарела и может быть удалена в функции.

Идея состоит в том, что вы получаете токен из одного сеанса, используя sp_getbindtoken и сначала привязать другой сеанс к этому, используя sp_bindsession. Вам придется немного поэкспериментировать, чтобы увидеть, работает ли это для вашего сценария.

Функция замены, предложенная в документах, указанных выше: set-mars?view=sql-server-2017" rel="nofollow noreferrer">Несколько активных наборов результатов (MARS). Вам снова придется поэкспериментировать.

person kirchner    schedule 24.01.2019

Другой подход, который я бы НЕ рекомендовал, заключается в использовании распределенных транзакций. SQL Server поддерживает регистрацию в распределенной транзакции. Таким образом, вы можете зарегистрировать каждую задачу БД в распределенной транзакции и в конце зафиксировать\откатить ее.

Обычно вы используете распределенные транзакции для координации транзакций между несколькими хранилищами данных транзакций, однако это также будет работать с несколькими подключениями к одной и той же базе данных, но я не думаю, что это хороший подход.

Для этого вам понадобится координатор распределенных транзакций (MSDTC делает это в Windows), и он получает сложный и может иметь проблемы с производительностью.

person PhilS    schedule 24.01.2019

Одним из подходов может быть использование шаблона работы на стороне узла.

К сожалению, я не знаю, существует ли уже модуль, который поможет вам это сделать.

person PhilS    schedule 24.01.2019