Obsługa lokalnych transakcji w natywnym kliencie SQL Server

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Sesja ogranicza zakres transakcji dla lokalnej transakcji dostawcy OLE DB Native Client SQL Server. Gdy na polecenie konsumenta dostawca natywnego klienta OLE DB SQL Server wysyła żądanie do połączonej instancji SQL Server, żądanie stanowi jednostkę pracy dla dostawcy SQL Server Native Client OLE DB. Lokalne transakcje zawsze obejmują jedną lub więcej jednostek pracy na jednej sesji dostawcy SQL Server Native Client OLE DB.

Korzystając z domyślnego trybu automatycznego zatwierdzania dostawcy SQL Server Native Client OLE DB, pojedyncza jednostka pracy traktowana jest jako zakres lokalnej transakcji. W transakcji lokalnej uczestniczy tylko jedna jednostka. Po utworzeniu sesji dostawca natywnej klienci OLE DB SQL Server rozpoczyna transakcję dla 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 dostawca natywnego klienta OLE DB SQL Server rozpoczyna nową lokalną transakcję dla sesji, aby cała praca była wykonywana w ramach transakcji.

Konsument dostawcy SQL Server Native Client OLE DB 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. Dostawca natywnej klientowej OLE DB 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.

Dostawca natywnej klientowej bazy danych 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 dostawca natywnych klientów OLE DB 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] Provider natywnego klienta OLE DB SQL Server zwraca błąd dla dowolnej wartości innej niż zero.
pOtherOptions[in] Jeśli nie NULL, dostawca natywnej klientowej bazy danych OLE DB SQL Server żąda obiektu opcji z interfejsu. Provider SQL Server Native Client OLE DB zwraca XACT_E_NOTIMEOUT, jeśli członek ulTimeout obiektu opcji nie jest zerowy. Dostawca natywnego klienta OLE DB SQL Server ignoruje wartość członka szDescription.
pulTransactionLevel[out] Jeśli nie NULL, dostawca natywnego klienta OLE DB SQL Server zwraca zagnieżdżony poziom transakcji.

Dla transakcji lokalnych provider bazy danych SQL Server Native Client OLE 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, dostawca natywnej klientowej bazy danych OLE DB SQL Server wraca do trybu automatycznego zatwierdzania sesji.
fAsync[in] Asynchroniczne przerwanie nie jest obsługiwane przez natywnego klienta OLE DB w SQL Server. Dostawca SQL Server Native Client OLE DB zwraca XACT_E_NOTSUPPORTED, jeśli wartość nie jest FAŁSZYWA.

Dla transakcji lokalnych provider natywnego klienta OLE DB 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, dostawca natywnej klientowej bazy danych OLE DB SQL Server wraca do trybu automatycznego zatwierdzania sesji.
grfTC[in] Asynchroniczne i fazowe powroty nie są obsługiwane przez dostawcę bazy danych SQL Server Native Client. Dostawca SQL Server Native Client OLE DB zwraca XACT_E_NOTSUPPORTED za dowolną wartość inną niż XACTTC_SYNC.
grfRM[in] Musi mieć wartość 0.

Wiersze dostawcy OLE DB SQL Server Native Client OLE DB w sesji są zachowywane w operacji lokalnego zatwierdzania lub przerwania 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 SQL Server natywne zestawy wierszy dostawcy OLE DB Native Client na sesji są tracone po operacji przerwania lub zatwierdzenia.

Provider natywnego klienta OLE DB 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.