Что делает DbConnection.EnlistTransaction делать?

Что делает DbConnection.EnlistTransaction делать?

2 ответов


DbConnection.EnlistTransaction позволяет:

  • присоединение к соединению с System.Transactions.Transaction. Он имеет некоторые ограничения:
    • если соединение уже участвует в" локальной " транзакции (System.Data.Common.DbTransaction), он может завершиться неудачей за исключением. (Это, похоже, зависит от конкретной реализации соединения: Firebird 2 не бросает исключение в такой ситуации,SqlConnection и, вероятно, большинство других бросать.)
    • если соединение уже было присоединено к другому System.Transactions.Transaction, и эта другая транзакция все еще активна, она завершится с ошибкой за исключением.
    • С одной и той же транзакции поддерживается, по крайней мере SqlConnection, OleDbConnection и OdbcConnection.
      Это может произойти, если соединение имеет некоторые ресурсы в настоящее время используется, как используется открытым считывателем данных. (Этот случай выглядит как слишком ранняя проверка внутренней реализации из этих соединений, выполненных до реализации поставляемой транзакции, уже присоединены.)
      Другое DbConnection реализация может отличаться. Например, HanaConnection (начиная с HANA 2 SP3) бросает в таком случае, что довольно неудобно для кода, который всегда явно записывается, в то время как автоматическое подключение не было отключено в его строке подключения.
  • оставить транзакцию, в которой соединение было зарегистрировано, при условии, что транзакция больше не активна. (В противном случае попытка использовать соединение может завершиться ошибкой с исключением, по крайней мере, с OdbcConnection.) Поставка null как транзакция для этого.
    Обратите внимание, что некоторые соединения не поддерживают это, например SqlCeConnection, который бросает!--13--> и SQLiteConnection (по крайней мере до v1.0.105), который выдает ArgumentNullException.
    Может потребоваться оставить транзакцию после ее завершения, если вы хотите использовать соединение для некоторых другие операции без присоединения к другой транзакции. Некоторые соединения, похоже, автоматически покидают транзакцию, другие-нет.
    Поведение соединений после удаления области также может изменяться в зависимости от того, была ли распределена предыдущая транзакция. При распределении удаление области может завершиться, как только все участники проголосуют (первый этап двух этапов фиксации), в результате чего код после удаления области будет выполняться одновременно со вторым этапом, включенным одновременно с собственным вторым этапом соединения. (посмотреть здесь.) В зависимости от реализации соединения явный запрос на выход из транзакции может облегчить проблему.

DbConnection.EnlistTransaction обычно используется с System.Transactions.Transaction.Current. Не требуется использовать его, если соединение приобретено (открыто) в пределах TransactionScope: в таком случае соединение автоматически подключается к текущей транзакции (если его строка соединения диктует иначе с enlist=false). Но опять же, некоторые реализации соединений могут отличаться и здесь: некоторые из них не имеют автоматического включения по умолчанию и имеют для него совершенно другую семантику (например,FbConnection до его версии 6.0), или использовать другой параметр строки подключения (например,MySqlConnection использует AutoEnlist).


Это позволяет координировать транзакции между несколькими соединениями. При использовании TransactionScope соединение автоматически включается в транзакцию. В противном случае вы должны сделать enlist с существующей транзакцией.