MS SQL Server 6.5 — страница 13
обратилось приложение, инициировавшее транзакцию, называется первичным[1] менеджером транзакций. Пусть HRESULT hr; ITransactionDispenser *pTxDispenser; тогда hr = DtcGetTransactionManager( NULL, // имя хоста DTC, NULL // означает данный хост NULL, // имя менеджера транзакций IID_ITransactionDispenser, // требуемый интерфейс 0, // зарезервировано 0, // зарезервировано (void *)NULL, // зарезервировано (void **)&pTxDispenser); возвращает указатель на первичный менеджер транзакций. После того как приложение установило соединение с соответствующим DTC-сервисом, все остальные экземпляры DTC, поднявшиеся на хостах менеджеров ресурсов, являются подчиненными. В ответ на вызов приложения первичный менеджер транзакций создает объект "транзакция", указатель на который можно получить как ITransaction *pTx; hr = pTxDispenser->BeginTransaction ( NULL, // управляющий интерфейс ISOLATIONLEVEL_BROWSE, // уровень изоляции 0, // флаги изоляции NULL, // зарезервировано &pTx); // Ptr на объект "транзакция" Как видно из примера, приложение начинает распределенную транзакцию, вызывая метод BeginTransaction объекта "первичный менеджер транзакции". После этого оно может работать с менеджерами ресурсов. Первое обращение к менеджеру ресурсов из приложения однозначно идентифицирует текущую транзакцию. Менеджеры ресурсов, участвующие в данной транзакции, должны прописаться в объекте "транзакция" при помощи менеджеров транзакций. RETCODE rc; HDBC hSrv1, hSrv2;• rc = SQLSetConnectOption( hSrv1, SQL_COPT_SS_ENLIST_IN_DTC, pTx); rc = SQLSetConnectOption( hSrv2, SQL_COPT_SS_ENLIST_IN_DTC, pTx); После этого все обращения к базам данных от менеджеров ресурсов через установленные соединения выполняются от имени транзакции, пока она не завершит свое действие. DbExecSQL(hSrv1,"INSERT INTO..."); DbExecSQL(hSrv2,"INSERT INTO..."); ... hr=pTx->Commit(0,0,0);•hr=pTx->Release() Инициация распределенных транзакций сервером имеет ряд дополнительных преимуществ по сравнению с только что рассмотренной инициацией на стороне клиента. К ним относятся меньшие сетевые затраты при управлении транзакциями, а также то, что ошибка на клиенте не "подвешивает" транзакции в состоянии in-doubt. Кроме того, вызовы Transact-SQL достаточно просты в использовании. При явном определении все вызовы удаленных процедур наследуют контекст распределенной транзакции. BEGIN DISTRIBUTED TRANSACTION INSERT INTO ACCOUNTS VALUES (100,20) EXEC RMTBRANCH.ACCOUNTS.DBO.DEPOSIT 100,20 COMMIT TRANSACTION При неявном определении при помощи установок sp_configure "remote proc trans", 1 (уровень сервера) или set remote_ procedure_transactions on (уровень сессии) MS SQL Server по умолчанию рассматривает локальные транзакции, начатые begin transaction, как распределенные с подключением DTC, если в них содержатся вызовы удаленных хранимых процедур. Корректное завершение транзакции выполняется при помощи протокола
Похожие работы
- Рефераты