Поделиться через


Распределенные транзакции (ADO.NET)

Обновлен: November 2007

Транзакция — это набор связанных задач, который, помимо всего прочего, завершается успешно (фиксация) или с ошибкой (отмена) как единое целое. Распределенная транзакция — это транзакция, затрагивающая несколько ресурсов. Для фиксации распределенной транзакции все участники должны гарантировать, что любое изменение данных будет постоянным. Изменения необходимо сохранять, несмотря на сбои системы или другие непредвиденные события. Если хоть один из участников не сможет предоставить такую гарантию, вся транзакция завершится с ошибкой и будет выполнен откат любых изменений данных внутри области транзакции.

ms254973.alert_note(ru-ru,VS.90).gifПримечание.

Если DataReader запускается во время активной транзакции, то при попытке зафиксировать или выполнить откат транзакции возникнет исключение.

Работа с System.Transactions

На платформе.NET Framework распределенные транзакции управляются с помощью API-интерфейса пространства имен System.Transactions. При участии нескольких постоянных диспетчеров ресурсов API-интерфейс System.Transactions делегирует обработку распределенной транзакции средству наблюдения за транзакциями, такому как координатор распределенных транзакций (Майкрософт) (MSDTC). Дополнительные сведения см. в разделе Transaction Fundamentals.

В ADO.NET 2.0 появилась поддержка прикрепления распределенных транзакций с помощью метода EnlistTransaction, который прикрепляет подключение к экземпляру Transaction. В предыдущих версиях ADO.NET явное прикрепление к распределенной транзакции выполнялось с помощью метода соединения EnlistDistributedTransaction для прикрепления соединения к экземпляру ITransaction, который поддерживался в целях обратной совместимости. Дополнительные сведения о транзакциях служб Enterprise Services см. в разделе Interoperability with Enterprise Services and COM+ Transactions.

При использовании транзакции System.Transactions с поставщиком .NET Framework для SQL Server для базы данных SQL Server 2005 автоматически будет использована упрощенная Transaction. Затем по мере необходимости транзакция может стать полной распределенной транзакцией. Дополнительные сведения см. в разделе Интеграция System.Transactions с SQL Server (ADO.NET).

ms254973.alert_note(ru-ru,VS.90).gifПримечание.

Максимальное количество распределенных транзакций, которое база данных Oracle может обрабатывать одновременно, по умолчанию равно 10. При соединении с базой данных Oracle после десятой транзакции возникает исключение. Oracle не поддерживает инструкции языка DDL внутри распределенной транзакции.

Автоматическое прикрепление к распределенной транзакции

Автоматическое прикрепление является способом интеграции соединений ADO.NET по умолчанию (и предпочитаемым) с System.Transactions. В случае определения активной транзакции (что, с точки зрения System.Transaction, означает, что Transaction.Current отлична от значения типа NULL) объект соединения автоматически будет прикреплен к существующей распределенной транзакции. Автоматическое прикрепление транзакции происходит при открытии соединения. Оно не произойдет после открытия, даже если команда выполняется внутри области транзакций. Для отключения автоматического прикрепления в существующих транзакциях следует указать Enlist=false в качестве параметра строки соединения для ConnectionString или OLE DB Services=-7 в качестве параметра строки соединения для ConnectionString. Дополнительные сведения о параметрах строки соединения Oracle и ODBC см. в ConnectionString и ConnectionString.

Ручное прикрепление к распределенной транзакции

Если автоматическое прикрепление отключено или необходимо прикрепить транзакцию, запущенную после открытия соединения, то можно осуществить прикрепление к существующей распределенной транзакции с помощью метода EnlistTransaction объекта DbConnection для рабочего поставщика. Прикрепление к существующей распределенной транзакции гарантирует, что в случае фиксации или отката транзакции изменения, выполненные кодом в источнике данных, будут также зафиксированы или откатаны назад.

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

EnlistTransaction принимает один аргумент типа Transaction, который является ссылкой к существующей транзакции. После вызова метода соединения EnlistTransaction все изменения в источнике данных, выполненные с помощью соединения, включаются в транзакцию. Передача значения NULL исключает соединение из прикрепления к текущей распределенной транзакции. Обратите внимание, что соединение должно быть открыто до вызова EnlistTransaction.

ms254973.alert_note(ru-ru,VS.90).gifПримечание.

После явного прикрепления соединения к транзакции нельзя отменить его прикрепление или прикрепить к другой транзакции до завершения первой транзакции.

ms254973.alert_caution(ru-ru,VS.90).gifВнимание!

Если соединение уже запустило транзакцию с помощью метода соединений BeginTransaction, то EnlistTransaction вызовет исключение. Однако, если транзакция является локальной и запущенной из источника данных (например, явно выполнив инструкцию BEGIN TRANSACTION с помощью SqlCommand), EnlistTransaction выполнит откат локальной транзакции и прикрепит к существующей распределенной транзакции. Уведомления об откате локальной транзакции не высылается, и управление любыми незапущенными локальными транзакциями осуществляется с помощью BeginTransaction. При использовании поставщика данных .NET Framework для SQL Server (SqlClient) с SQL Server 2005 попытка прикрепления вызовет исключение. Все остальные случаи исключений не вызовут.

Повышаемые транзакции в SQL Server 2005

SQL Server 2005 поддерживает повышаемые транзакции, в которых локальная упрощенная транзакция может быть автоматически повышена до распределенной, если потребуется. Повышаемая транзакция не вызывает дополнительную нагрузку распределенной транзакции, если таковая не требуется. Дополнительные сведения и образец кода см. в разделе Интеграция System.Transactions с SQL Server (ADO.NET).

Настройка распределенных транзакций

При использовании более новой операционной системы с установленными последними пакетами обновлений, например Windows XP или Windows Server 2003, для использования распределенных транзакций может потребоваться включение координатора распределенных транзакций (MS DTC) в сети. При включенном брандмауэре Windows (по умолчанию для Windows XP с пакетом обновления 2 (SP2) он включен) необходимо разрешить службе координатора распределенных транзакций (MS DTC) использовать сеть или открыть для нее порт.

См. также

Основные понятия

Интеграция System.Transactions с SQL Server (ADO.NET)

Другие ресурсы

Транзакции и параллелизм (ADO.NET)