Поддержка транзакций SQL через вызовы веб-служб в .Net

#.net #service #distributed #transactions

Вопрос:

Как выполнить транзакцию базы данных, в которой я создаю новую запись, а затем вызываю веб-службу, используя новый идентификатор записи, возвращенный из базы данных, который также будет управлять той же базой данных? Очевидно, я мог бы обновить все таблицы непосредственно из одного и того же объекта SqlConnection, но логика вызова веб-службы может быть изменена, и мне действительно нужно убедиться, что изменения, внесенные моим кодом, зафиксированы вместе с изменениями, внесенными вызываемой веб-службой.

Ответ №1:

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

Ответ №2:

Это не то, что вам нужно в реальной транзакции. Транзакции должны быть как можно более короткими, что означает отсутствие взаимодействия с пользователем в процессе или, в данном случае, ожидания ответа веб-службы.

Что касается вашей проблемы,если у вас есть контроль над веб-службой, измените веб-службу, чтобы вызвать хранимую процедуру, которая выполняет всю транзакцию. Если есть действия, которые НЕОБХОДИМО выполнять каждый раз при вызове службы, то они должны быть частью службы.

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

Предполагая, что веб-служба обращается к таблицам напрямую (фу), вам нужно будет ввести код в вызывающий код, который выполняет вставку, вызывает веб-службу, затем проверяет, сделала ли веб-служба то, что она должна была сделать, и если это не так, ваш код выполняет необходимые действия, чтобы все отменить. Это в основном похоже на доморощенный механизм транзакций. Он также очень грязный и, как правило, подвержен ошибкам и его трудно поддерживать. Не говоря уже о том, что это не 100% полное доказательство.