Параллельные запросы по разным соединениям в одной транзакции - PullRequest
0 голосов
/ 24 января 2019

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

Проблема:

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

Анализ:

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

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

Ответы [ 3 ]

0 голосов
/ 24 января 2019

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

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

0 голосов
/ 24 января 2019

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

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

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

0 голосов
/ 24 января 2019

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

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

Функция замены, предложенная в документах, на которые ссылаются выше, это Множественные активные наборы результатов (MARS) .Снова вам придется поэкспериментировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...