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


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

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

ПримечаниеПримечание

Если 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).

ПримечаниеПримечание

Максимальное количество распределенных транзакций, которое база данных 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.

ПримечаниеПримечание

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

Предупреждающее замечаниеВнимание

Если соединение уже запустило транзакцию с помощью метода соединений 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)