#.net #service #distributed #transactions
Вопрос:
Как выполнить транзакцию базы данных, в которой я создаю новую запись, а затем вызываю веб-службу, используя новый идентификатор записи, возвращенный из базы данных, который также будет управлять той же базой данных? Очевидно, я мог бы обновить все таблицы непосредственно из одного и того же объекта SqlConnection, но логика вызова веб-службы может быть изменена, и мне действительно нужно убедиться, что изменения, внесенные моим кодом, зафиксированы вместе с изменениями, внесенными вызываемой веб-службой.
Ответ №1:
Если веб-служба несет ответственность за управление базой данных, я бы расширил веб-службу для выполнения действий, которые выполняет ваш код. Смысл использования веб-службы заключается (должен заключаться) в том, чтобы отделить ваш код от необходимости иметь дело непосредственно с базой данных. Введение прямых манипуляций с БД в ваш код просто сделает вещи намного более запутанными и сложными в обслуживании.
Ответ №2:
Это не то, что вам нужно в реальной транзакции. Транзакции должны быть как можно более короткими, что означает отсутствие взаимодействия с пользователем в процессе или, в данном случае, ожидания ответа веб-службы.
Что касается вашей проблемы,если у вас есть контроль над веб-службой, измените веб-службу, чтобы вызвать хранимую процедуру, которая выполняет всю транзакцию. Если есть действия, которые НЕОБХОДИМО выполнять каждый раз при вызове службы, то они должны быть частью службы.
Я предполагаю, что у вас нет контроля над веб-службой, хотя, иначе это не было бы проблемой. Как веб-служба получает доступ к базе данных? Если он уже использует хранимую процедуру, то вы должны иметь возможность добавить туда необходимую логику. Опять же, я предполагаю, что это не так, иначе это не было бы проблемой. Я предлагаю вам попытаться изменить веб-службу в соответствии с этой архитектурой, если это вообще возможно.
Предполагая, что веб-служба обращается к таблицам напрямую (фу), вам нужно будет ввести код в вызывающий код, который выполняет вставку, вызывает веб-службу, затем проверяет, сделала ли веб-служба то, что она должна была сделать, и если это не так, ваш код выполняет необходимые действия, чтобы все отменить. Это в основном похоже на доморощенный механизм транзакций. Он также очень грязный и, как правило, подвержен ошибкам и его трудно поддерживать. Не говоря уже о том, что это не 100% полное доказательство.