Распределенные транзакции MS DTC

Приложения, написанные с помощью OLE DB, Open Database Connectivity (ODBC), ActiveX Data Objects (ADO) или DB-Library, могут применять распределенные транзакции Transact-SQL, выполняя инструкции Transact-SQL для запуска и остановки распределенных транзакций Transact-SQL. OLE DB и ODBC также поддерживают управление распределенными транзакциями на уровне API. Приложения OLE DB и ODBC могут использовать эти функции API для управления распределенными транзакциями, включая других диспетчеров ресурсов COM (Component Object Mode), которые поддерживают транзакции координатора распределенных транзакций (Майкрософт) (MS DTC), отличные от транзакций компонента SQL Server Database Engine. Также благодаря функциям API они могут лучше управлять границами распределенных транзакций, например несколькими компьютерами, выполняющими экземпляры компонента Database Engine.

Распределенные транзакции ODBC

Можно управлять локальными транзакциями на уровне API-интерфейса ODBC, установив значение атрибута соединения SQL_ATTR_AUTOCOMMIT равным SQL_AUTOCOMMIT_OFF, а затем вызывая функцию ODBC SQLEndTran для фиксации или отката каждой транзакции. Не используйте эти функции для управления распределенной транзакцией в приложении ODBC. Используйте методы MS DTC COM:

  • вызовите функцию DtcGetTransactionManager, чтобы подключиться к координатору MS DTC;

  • вызовите метод ITransactionDispenser::BeginTransaction, чтобы запустить распределенную транзакцию и получить объект транзакции;

  • для каждого соединения ODBC, участвующего в распределенной транзакции, вызовите функцию ODBC SQLSetConnectAttr с параметром fOption, равным SQL_COPT_SS_ENLIST_IN_DTC, и параметром vParam, равным адресу объекта транзакции, полученного с помощью метода ITransactionDispenser::BeginTransaction;

  • после завершения транзакции вместо функции ODBC SQLEndTran вызовите метод ITransaction::Commit или ITransaction::Rollback для объекта транзакции, полученного с помощью метода ITransactionDispenser::BeginTransaction.

Распределенные транзакции OLE DB

Модель управления распределенной транзакцией в OLE DB схожа с моделью управления локальной транзакцией. Для управления локальной транзакцией клиент OLE DB:

  • использует метод ITransactionLocal::StartTransaction, чтобы запустить локальную транзакцию и получить объект транзакции;

  • вызывает метод ITransaction::Commit или ITransaction::Rollback для объекта транзакции, полученного с помощью метода ITransactionLocal::StartTransaction.

Для управления распределенной транзакцией клиент:

  • вызывает функцию DtcGetTransactionManager, чтобы подключиться к координатору MS DTC;

  • вызывает метод ITransactionDispenser::BeginTransaction, чтобы запустить распределенную транзакцию и получить объект транзакции;

  • вызывает интерфейс ITransactionJoin объекта распределенной транзакции для каждого соединения, участвующего в распределенной транзакции;

  • вызывает метод ITransaction::Commit или ITransaction::Rollback объекта распределенной транзакции для завершения транзакции.