Параллельные запросы по разным соединениям в одной транзакции
У меня есть сценарий, чтобы реализовать управление рабочим процессом. Существует опция, с параллельным шлюзом, две (или более) ветви задач могут выполняться параллельно. Задача по сути означает некоторую операцию с БД.
Проблема:
Принимая во внимание тип выполнения в песочнице, мне нужно все вернуть, если что-то пойдет не так. Так что все должно быть сделано в рамках одной транзакции. Но это не подходит, когда у меня есть пара параллельных запросов task/db.
Анализ:
Так как я использую пул узлов (используется под node-mssql) для пула соединений. Таким образом, для запуска транзакции мы получаем одно соединение и выполняем последующие запросы в том же самом. Чтобы другой запрос выполнялся параллельно, нам нужно другое соединение из пула, которое не разделяет транзакцию или ресурс первого соединения.
Есть ли способ сделать это? Любая помощь или обсуждение приветствуется.
3 ответа
В SQL Server есть функция, позволяющая привязать сеанс к другому, и это означает, что они совместно используют одну транзакцию и пространство блокировки, но функция устарела и может быть удалена в функции.
Идея состоит в том, что вы получаете токен из одного сеанса с помощью sp_getbindtoken и привязываете другой сеанс к этому первому с помощью sp_bindsession. Вам придется немного поэкспериментировать, чтобы увидеть, подходит ли вам этот сценарий.
Функция замены, предложенная в документах, связанных с выше, является множественными активными наборами результатов (MARS). Опять вам придется поэкспериментировать.
Один из подходов заключается в использовании шаблона единицы работы на стороне узла.
К сожалению, я не знаю, существует ли модуль, который бы помог вам в этом.
Другой подход, который я бы НЕ рекомендовал, - это использование распределенных транзакций. SQL Server поддерживает регистрацию в распределенной транзакции. Таким образом, вы можете зарегистрировать каждую задачу БД в распределенной транзакции и в конце зафиксировать \ откатить ее.
Обычно вы используете распределенные транзакции для координации транзакций между несколькими хранилищами данных транзакций, однако это также будет работать с несколькими подключениями к одной и той же базе данных, но я не думаю, что это хороший подход.
Для этого вам понадобится координатор распределенных транзакций ( MSDTC делает это в Windows), и он становится сложным и может иметь проблемы с производительностью.