Как «растянуть» транзакцию на два несвязанных или несвязанных вызова метода?

Я занят созданием приложения для обновления программного обеспечения на C#, WinForms, .NET 3.5, где у меня есть набор подключаемых классов задач с общим базовым классом. Я хотел бы, чтобы одна задача, обновление базы данных, начала транзакцию, а другая задача, обновление веб-сайта, чтобы зафиксировать или откатить ту же транзакцию, чтобы веб-сайт и БД всегда были синхронизированы.

Я смутно припоминаю вещи из моих дней VB6, когда метод COM+ мог присоединиться к транзакции, если она уже была запущена, или начать ее, если нет, и т. д. У меня также есть смутные воспоминания об этом переносе на .NET Enterprise Services, но это также было пока назад.

Какие современные технологии можно использовать для достижения этой цели?


person ProfK    schedule 21.04.2009    source источник


Ответы (3)


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

Если у вас есть другие задачи для подключения, попросите UpgradeManager выполнить итерацию по набору ваших задач.

... или вы могли бы передать транзакцию, как сказал Харпо (его ответ пришел в середине написания моего) ... хорошо, что есть варианты. ;-)

Нейт

person Nathan Southerland    schedule 21.04.2009
comment
Спасибо, теперь у меня есть идея предоставить транзакцию объектам задач как службу в их контейнере. - person ProfK; 22.04.2009


Возможно, вы захотите начать здесь.

http://msdn.microsoft.com/en-us/library/86773566.aspx

SqlConnection.BeginTransaction возвращает SqlTransaction, реализующий IDbTransaction.

В IDbTransaction определены два метода: Commit() и Rollback(). Если вы сохраняете объект соединения между вызовами, вы должны иметь возможность передавать транзакцию из одного места в другое и выполнять там фиксацию или откат.

Если вы не используете SQL Server, поставщик базы данных (OleDb, Odbc и т. д.) предоставит соответствующий объект.

person harpo    schedule 21.04.2009