Unterstützung lokaler Transaktionen in SQL Server Native Client

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Eine Sitzung begrenzt den Transaktionsbereich für eine lokale Transaktion SQL Server Native Client OLE DB-Anbieters. Wenn der SQL Server Native Client OLE DB-Anbieter auf Anweisung eines Consumers eine Anforderung an eine verbundene instance von SQL Server sendet, stellt die Anforderung eine Arbeitseinheit für den SQL Server Native Client OLE DB-Anbieter dar. Lokale Transaktionen umschließen immer eine oder mehrere Arbeitseinheiten für eine einzelne SQL Server Native Client OLE DB-Anbietersitzung.

Bei Verwendung des standardmäßigen SQL Server Native Client autocommit-Modus des OLE DB-Anbieters wird eine einzelne Arbeitseinheit als Bereich einer lokalen Transaktion behandelt. Nur eine Einheit nimmt an der lokalen Transaktion teil. Wenn eine Sitzung erstellt wird, beginnt der SQL Server Native Client OLE DB-Anbieter eine Transaktion für die Sitzung. Nach der erfolgreichen Verarbeitung einer Arbeitseinheit wird ein Commit für die Arbeit ausgeführt. Bei Auftreten eines Fehlers wird ein Rollback für den begonnenen Teil der Arbeit ausgeführt, und der Fehler wird dem Consumer gemeldet. In beiden Fällen beginnt der SQL Server Native Client OLE DB-Anbieter eine neue lokale Transaktion für die Sitzung, sodass die gesamte Arbeit innerhalb einer Transaktion ausgeführt wird.

Der SQL Server Native Client OLE DB-Anbieter-Consumer kann mithilfe der ITransactionLocal-Schnittstelle präzisere Kontrolle über den lokalen Transaktionsbereich steuern. Wenn eine Consumersitzung eine Transaktion initiiert, werden alle Arbeitseinheiten der Sitzung zwischen dem Anfangspunkt der Transaktion und eventuellen Aufrufen der Methode Commit oder der Methode Abort als eine unteilbare Einheit behandelt. Der SQL Server Native Client OLE DB-Anbieters beginnt implizit eine Transaktion, wenn er vom Consumer dazu aufgefordert wird. Wenn der Consumer keine Beibehaltung anfordert, kehrt die Sitzung zum Verhalten der übergeordneten Transaktionsebene zurück, in der Regel ist das der Autocommitmodus.

Der SQL Server Native Client OLE DB-Anbieter unterstützt ITransactionLocal::StartTransaction-Parameter wie folgt.

Parameter BESCHREIBUNG
isoLevel[in] Die innerhalb dieser Transaktion zu verwendende Isolationsstufe. In lokalen Transaktionen unterstützt der SQL Server Native Client OLE DB-Anbieter Folgendes:

ISOLATIONLEVEL_UNSPECIFIED

ISOLATIONLEVEL_CHAOS

ISOLATIONLEVEL_READUNCOMMITTED

ISOLATIONLEVEL_READCOMMITTED

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_CURSORSTABILITY

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_SERIALIZABLE

ISOLATIONLEVEL_ISOLATED

ISOLATIONLEVEL_SNAPSHOT



Hinweis: Unabhängig davon, ob die Versionsverwaltung für die Datenbank aktiviert ist, ist ISOLATIONLEVEL_SNAPSHOT ab SQL Server 2005 (9.x) für das Argument isoLevel gültig. Jedoch tritt ein Fehler auf, wenn der Benutzer versucht, eine Anweisung auszuführen und die Versionsverwaltung nicht aktiviert und/oder die Datenbank nicht schreibgeschützt ist. Zudem tritt bei einer Verbindung mit einer SQL Server-Version, die älter als SQL Server 2005 (9.x) ist, der Fehler XACT_E_ISOLATIONLEVEL auf, wenn ISOLATIONLEVEL_SNAPSHOT als isoLevel angegeben wird.
isoFlags[in] Der SQL Server Native Client OLE DB-Anbieters gibt einen Fehler für einen anderen Wert als null zurück.
pOtherOptions[in] Wenn nicht NULL, fordert der SQL Server Native Client OLE DB-Anbieter das Optionsobjekt über die Schnittstelle an. Der SQL Server Native Client OLE DB-Anbieter gibt XACT_E_NOTIMEOUT zurück, wenn der ulTimeout-Member des Optionsobjekts nicht 0 null ist. Der SQL Server Native Client OLE DB-Anbieter ignoriert den Wert des szDescription-Members.
pulTransactionLevel[out] Wenn nicht NULL, gibt der SQL Server Native Client OLE DB-Anbieter die geschachtelte Ebene der Transaktion zurück.

Für lokale Transaktionen implementiert der SQL Server Native Client OLE DB-Anbieter ITransaction::Abort-Parameter wie folgt.

Parameter BESCHREIBUNG
pboidReason[in] Wird bei Festlegung ignoriert. Kann daher auch NULL sein.
fRetaining[in] Wenn der Wert TRUE lautet, wird eine neue Transaktion implizit für die Sitzung begonnen. Für die Transaktion muss vom Consumer ein Commit ausgeführt werden oder sie muss beendet werden. Bei FALSE wird der SQL Server Native Client OLE DB-Anbieter in den Modus für automatisches Aktivieren für die Sitzung zurückgesetzt.
fAsync[in] Der asynchrone Abbruch wird vom SQL Server Native Client OLE DB-Anbieter nicht unterstützt. Der SQL Server Native Client OLE DB-Anbieter gibt XACT_E_NOTSUPPORTED zurück, wenn der Wert nicht FALSE ist.

Für lokale Transaktionen implementiert der SQL Server Native Client OLE DB-Anbieter ITransaction::Commitparameter wie folgt.

Parameter BESCHREIBUNG
fRetaining[in] Wenn der Wert TRUE lautet, wird eine neue Transaktion implizit für die Sitzung begonnen. Für die Transaktion muss vom Consumer ein Commit ausgeführt werden oder sie muss beendet werden. Bei FALSE wird der SQL Server Native Client OLE DB-Anbieter in den Modus für automatisches Aktivieren für die Sitzung zurückgesetzt.
grfTC[in] Asynchrone Und Phase 1-Rückgaben werden vom SQL Server Native Client OLE DB-Anbieter nicht unterstützt. Der SQL Server Native Client OLE DB-Anbieter gibt XACT_E_NOTSUPPORTED für jeden anderen Wert als XACTTC_SYNC zurück.
grfRM[in] Muss den Wert 0 (null) haben.

Die SQL Server Native Client OLE DB-Anbieterrowsets in der Sitzung werden für einen lokalen Commit- oder Abbruchvorgang basierend auf den Werten der Rowseteigenschaften DBPROP_ABORTPRESERVE und DBPROP_COMMITPRESERVE beibehalten. Standardmäßig sind diese Eigenschaften sowohl VARIANT_FALSE als auch alle SQL Server Native Client OLE DB-Anbieterrowsets in der Sitzung gehen nach einem Abbruch- oder Commitvorgang verloren.

Der SQL Server Native Client OLE DB-Anbieter implementiert die ITransactionObject-Schnittstelle nicht. Bei einem Versuch des Consumers, einen Verweis auf die Schnittstelle abzurufen, wird E_NOINTERFACE zurückgegeben.

Im folgenden Beispiel wird ITransactionLocal verwendet.

// 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.  

Weitere Informationen

Transaktionen
Arbeiten mit der Momentaufnahmeisolation