Udostępnij przez


Wsparcie lokalnych transakcji

Dotyczy do:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSystem Platform Analitycznych (PDW)Baza danych SQL w Microsoft Fabric

pobierz sterownik OLE DB

Sesja ogranicza zakres transakcji dla lokalnej transakcji OLE DB Driver for SQL Server. Gdy na polecenie konsumenta sterownik OLE DB dla SQL Server wysyła żądanie do połączonej instancji SQL Server, żądanie to stanowi jednostkę pracy dla sterownika OLE DB dla SQL Servera. Lokalne transakcje zawsze obejmują jedną lub więcej jednostek pracy na jednej sesji sterownika OLE DB dla SQL Server.

Korzystając z domyślnego sterownika OLE DB dla trybu automatycznego zatwierdzania SQL Servera, pojedyncza jednostka pracy traktowana jest jako zakres lokalnej transakcji. W transakcji lokalnej uczestniczy tylko jedna jednostka. Po utworzeniu sesji sterownik OLE DB dla SQL Server rozpoczyna transakcję sesji. Po pomyślnym ukończeniu jednostki roboczej praca zostaje potwierdzona. W przypadku niepowodzenia każda rozpoczęta praca jest cofana i zgłaszana jest do konsumenta. W obu przypadkach sterownik OLE DB dla SQL Server rozpoczyna nową lokalną transakcję dla sesji, aby cała praca była wykonywana w ramach transakcji.

Sterownik OLE DB dla konsumenta SQL Server może precyzyjniej kontrolować lokalny zakres transakcji, korzystając z interfejsu ITransactionLocal . Gdy sesja konsumencka inicjuje transakcję, wszystkie jednostki pracy sesji między punktem startu transakcji a ostatecznymi wywołaniami metody Commit lub Abort są traktowane jako jednostka atomowa. Sterownik OLE DB dla SQL Server niejawnie rozpoczyna transakcję, gdy konsument mu to poleci. Jeśli konsument nie zażąda retencji, sesja wraca do zachowania na poziomie transakcji nadrodzica, najczęściej trybu automatycznego zatwierdzania.

Sterownik OLE DB dla SQL Server obsługuje parametry ITransactionLocal::StartTransaction w następujący sposób.

Parameter Description
isoLevel[in] Poziom izolacji, który ma być użyty przy tej transakcji. W transakcjach lokalnych sterownik OLE DB dla SQL Server obsługuje następujące funkcje:

ISOLATIONLEVEL_UNSPECIFIED

ISOLATIONLEVEL_CHAOS

ISOLATIONLEVEL_READUNCOMMITTED

ISOLATIONLEVEL_READCOMMITTED

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_CURSORSTABILITY

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_SERIALIZABLE

ISOLATIONLEVEL_ISOLATED

ISOLATIONLEVEL_SNAPSHOT



Uwaga: Począwszy od SQL Server 2005 (9.x), ISOLATIONLEVEL_SNAPSHOT jest prawidłowe dla argumentu poziomu isoLevel niezależnie od tego, czy wersjonowanie jest włączone dla bazy danych. Jednak błąd wystąpi, jeśli użytkownik spróbuje wykonać polecenie i wersjonowanie nie jest włączone i/lub baza danych nie jest dostępna tylko do odczytu. Dodatkowo, błąd XACT_E_ISOLATIONLEVEL wystąpi, jeśli ISOLATIONLEVEL_SNAPSHOT jest określony jako poziom isoLevel po połączeniu z wersją SQL Server starszą niż SQL Server 2005 (9.x).
isoFlags[in] Sterownik OLE DB dla SQL Server zwraca błąd dla dowolnej wartości innej niż zero.
pOtherOptions[in] Jeśli nie NULL, sterownik OLE DB dla SQL Server żąda obiektu opcji z interfejsu. Sterownik OLE DB dla SQL Server zwraca XACT_E_NOTIMEOUT, jeśli członek ulTimeout obiektu opcji nie jest zerowy. Sterownik OLE DB dla SQL Server ignoruje wartość członka szDescription .
pulTransactionLevel[out] Jeśli nie jest NULL, sterownik OLE DB dla SQL Server zwraca zagnieżdżony poziom transakcji.

Dla transakcji lokalnych sterownik OLE DB dla SQL Server implementuje parametry ITransaction::Abort w następujący sposób.

Parameter Description
pboidReason[in] Ignorowane, jeśli jest ustawione. Można bezpiecznie mieć NULL.
fRetenting[in] Gdy jest TRUE, nowa transakcja jest niejawnie rozpoczynana dla sesji. Transakcja musi zostać dokonana lub zakończona przez konsumenta. Gdy FALSE, sterownik OLE DB dla SQL Server wraca do trybu automatycznego zatwierdzania sesji.
fAsync[in] Asynchroniczne przerwanie nie jest obsługiwane przez sterownik OLE DB dla SQL Server. Sterownik OLE DB dla SQL Server zwraca XACT_E_NOTSUPPORTED, jeśli wartość nie jest FALSE.

Dla transakcji lokalnych sterownik OLE DB dla SQL Server implementuje parametry ITransaction::Commit w następujący sposób.

Parameter Description
fRetenting[in] Gdy jest TRUE, nowa transakcja jest niejawnie rozpoczynana dla sesji. Transakcja musi zostać dokonana lub zakończona przez konsumenta. Gdy FALSE, sterownik OLE DB dla SQL Server wraca do trybu automatycznego zatwierdzania sesji.
grfTC[in] Asynchroniczne i powroty fazy pierwszej nie są obsługiwane przez sterownik OLE DB dla SQL Server. Sterownik OLE DB dla SQL Server zwraca XACT_E_NOTSUPPORTED dla dowolnej wartości innej niż XACTTC_SYNC.
grfRM[in] Musi mieć wartość 0.

Sterownik OLE DB dla zestawów wierszy SQL Server na sesji jest zachowywany w lokalnej operacji commit lub abort na podstawie wartości właściwości zestawu wierszy DBPROP_ABORTPRESERVE i DBPROP_COMMITPRESERVE. Domyślnie te właściwości są VARIANT_FALSE i wszystkie sterowniki OLE DB dla zestawów wierszy SQL Server w sesji są tracone po operacji przerwania lub zatwierdzenia.

Sterownik OLE DB dla SQL Server nie implementuje interfejsu ITransactionObject . Próba pobrania referencji w interfejsie przez użytkownika zwraca E_NOINTERFACE.

Ten przykład wykorzystuje ITransactionLocal.

// Interfaces used in the example.  
IDBCreateSession*   pIDBCreateSession   = NULL;  
ITransaction*       pITransaction       = NULL;  
IDBCreateCommand*   pIDBCreateCommand   = NULL;  
IRowset*            pIRowset            = NULL;  
  
HRESULT             hr;  
  
// Get the command creation and local transaction interfaces for the  
// session.  
if (FAILED(hr = pIDBCreateSession->CreateSession(NULL,  
     IID_IDBCreateCommand, (IUnknown**) &pIDBCreateCommand)))  
    {  
    // Process error from session creation. Release any references and  
    // return.  
    }  
  
if (FAILED(hr = pIDBCreateCommand->QueryInterface(IID_ITransactionLocal,  
    (void**) &pITransaction)))  
    {  
    // Process error. Release any references and return.  
    }  
  
// Start the local transaction.  
if (FAILED(hr = ((ITransactionLocal*) pITransaction)->StartTransaction(  
    ISOLATIONLEVEL_REPEATABLEREAD, 0, NULL, NULL)))  
    {  
    // Process error from StartTransaction. Release any references and  
    // return.  
    }  
  
// Get data into a rowset, then update the data. Functions are not  
// illustrated in this example.  
if (FAILED(hr = ExecuteCommand(pIDBCreateCommand, &pIRowset)))  
    {  
    // Release any references and return.  
    }  
  
// If rowset data update fails, then terminate the transaction, else  
// commit. The example doesn't retain the rowset.  
if (FAILED(hr = UpdateDataInRowset(pIRowset, bDelayedUpdate)))  
    {  
    // Get error from update, then terminate.  
    pITransaction->Abort(NULL, FALSE, FALSE);  
    }  
else  
    {  
    if (FAILED(hr = pITransaction->Commit(FALSE, XACTTC_SYNC, 0)))  
        {  
        // Get error from failed commit.  
        }  
    }  
  
if (FAILED(hr))  
    {  
    // Update of data or commit failed. Release any references and  
    // return.  
    }  
  
// Release any references and continue.  

Zobacz też

Transakcje
Praca z Snapshot Isolation