Ответ 1
Кажется, вы можете повторно изобрести TransactionScope. Выполнение всего этого в рамках единицы работы прост *:
using (TransactionScope scope = new TransactionScope())
{
... Do Stuff with Connection 1 using SqlDataReader
... Do Stuff with Connection 2 using Entity Framework
... Do Stuff with Connection 3 on another Oracle Database
... And for good measure do some stuff in MSMQ or other DTC resource
scope.Complete(); // If you are happy
}
Stuff
не обязательно должен быть встроенным - он может быть в другом классе или другой сборке. Нет необходимости явно регистрировать подключения к базе данных или очереди с помощью TransactionScope
- все происходит automagically
, при условии, что ресурсы, которые вы используете, могут записаться в окружающая транзакция.
Теперь небольшая печать:
-
*
При одновременном использовании нескольких соединений с базой данных или разных цепочек соединений или нескольких технологий это потребует 2-фазный фиксатор и перейдем к транзакцииDTC
, чтобы обеспечить ACID через ресурсы. Сам DTC имеет намного более мелкий шрифт и предлагает гораздо больше проблемы в корпоративной сети, например , кластеризация, настройка безопасности и ошибки. -
Однако при использовании транзакций Lightweight на сервере MS Sql, если вы можете сохранить все свои подключения с использованием одной и той же базы данных и того же настройки строки подключения и закрыть каждое соединение перед открытием следующий, то вы можете избежать DTC.
-
Поддержание транзакции по нескольким ресурсам ACID будет неизменно поддерживать блокировки этих ресурсов до тех пор, пока транзакция не будет завершена или не откат. Это часто не способствует добрососедству на предприятии большого объема, поэтому обязательно рассмотрите последствия блокировки.
-
Если
Stuff
выполняется через несколько потоков, вам нужно будет вставить DependentTransaction -
Последнее, что стоит упомянуть, это уровень изоляции по умолчанию с
TransactionScope
- это Serializable, который подвержен взаимоблокировкам. В большинстве некритических сценариев вы, вероятно, сможете отказаться от этого Read Committed.