Иерархия TransactionScope - PullRequest
       13

Иерархия TransactionScope

3 голосов
/ 26 августа 2009

Возможно ли иметь иерархию областей транзакций?

Если внешняя область транзакции удаляет, что произойдет с изменениями, внесенными во внутреннюю область транзакции?

Моя конкретная проблема заключается в том, что у меня есть тестовый код, который запускает код с областью транзакции. Когда я вызываю второй набор кода с областью транзакции, я получаю «Невозможно получить доступ к удаленному объекту. Транзакция». Может ли быть так, что удаление внутренней области транзакции также удаляет внешнюю область транзакции.

Ответы [ 3 ]

3 голосов
/ 26 августа 2009

Я сомневаюсь, что это то, что происходит. TransactionScopes могут быть вложенными, если базовая технология поддерживает распределенные транзакции, если это необходимо. Например, если вы запускаете транзакцию и обновляете некоторые данные в базе данных A, а затем вызываете функцию, и внутри этой функции вы создаете новый TransactionScope и вставляете некоторые данные в базу данных B, тогда внутренняя транзакция использует «окружающий» транзакция, которая уже была открыта. Однако, чтобы это работало, вам нужен работающий координатор распределенных транзакций (для SQL-серверов). Кроме того, SQL Server 2005 и выше имеет возможность запускать транзакцию как обычную транзакцию и преобразовывать ее в распределенную транзакцию, если это необходимо, тогда как SQL 2000 запускает все из них как распределенные транзакции, поскольку не имеет возможности продвигать их.

Когда у вас есть вложенные транзакции, вся транзакция не фиксируется, пока не будет зафиксирована самая внешняя транзакция.

Вот дополнительная информация .

Посмотрите на TransactionScopeOption; это определяет, как вложенная транзакция взаимодействует с внешними транзакциями.

2 голосов
/ 26 августа 2009

Когда внешняя транзакция завершится неудачно, все внутренние будут отменены. Если вы совершите и внутреннее, и избавитесь от внешнего, внутреннее все еще откатывается назад. На самом деле внутреннее не фиксирует, если только внешнее не позволяет это сделать.

Вы совершаете внешнее, не так ли? См. здесь для хорошей статьи по этому вопросу.

1 голос
/ 11 октября 2009

Да, возможно иметь иерархию областей транзакций. В этом сообщении в блоге объясняется, как они работают, в частности, как следует создавать экземпляр внутренней области транзакции и как транзакции завершаются и фиксируются.

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

По поводу сообщения об ошибке «disposed» см. этот вопрос .

...