2008-10-10 4 views
2

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

ответ

4

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

0

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

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

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

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