Share via


Unterstützen lokaler Transaktionen

Eine Sitzung begrenzt den Transaktionsbereich für die lokale Transaktion eines 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 SQL Server-Instanz übermittelt, stellt die Anforderung für den SQL Server Native Client OLE DB-Anbieter eine Arbeitseinheit dar. Lokale Transaktionen umschließen stets eine oder mehrere Arbeitseinheiten in einer einzigen SQL Server Native Client OLE DB-Anbietersitzung.

Bei Verwendung des standardmäßigen Autocommitmodus des SQL Server Native Client OLE DB-Anbieters wird eine einzelne Arbeitseinheit als Bereich einer lokalen Transaktion behandelt. Nur eine Einheit nimmt an der lokalen Transaktion teil. Bei Erstellung einer Sitzung 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 jedem Fall beginnt der SQL Server Native Client OLE DB-Anbieter eine neue lokale Transaktion für die Sitzung, damit die gesamte Arbeitseinheit innerhalb einer Transaktion verarbeitet wird.

Der Consumer des SQL Server Native Client OLE DB-Anbieters kann den Bereich der lokalen Transaktion mithilfe der ItransactionLocal-Schnittstelle genauer steuern. Wenn eine Consumersitzung eine Transaktion initiiert, werden alle Arbeitseinheiten der Sitzung zwischen dem Anfangspunkt der Transaktion und eventuellen Aufrufen der Commit-Methode oder der Abort-Methode als eine unteilbare Einheit behandelt. Der SQL Server Native Client OLE DB-Anbieter beginnt eine Transaktion implizit, sobald 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

HinweisHinweis
Unabhängig davon, ob die Versionsverwaltung für die Datenbank aktiviert ist, ist ISOLATIONLEVEL_SNAPSHOT ab SQL Server 2005 für das isoLevel-Argument 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 ist, der Fehler XACT_E_ISOLATIONLEVEL auf, wenn ISOLATIONLEVEL_SNAPSHOT als isoLevel angegeben wird.

isoFlags[in]

Der SQL Server Native Client OLE DB-Anbieter gibt für jeden Wert außer 0 (null) einen Fehler zurück.

pOtherOptions[in]

Wenn der Parameterwert nicht NULL lautet, fordert der SQL Server Native Client OLE DB-Anbieter das Optionsobjekt von der Schnittstelle an. Der SQL Server Native Client OLE DB-Anbieter gibt XACT_E_NOTIMEOUT zurück, wenn das ulTimeout-Element des Optionsobjekts nicht 0 (null) ist. Der SQL Server Native Client OLE DB-Anbieter ignoriert den Wert des szDescription-Elements.

pulTransactionLevel[out]

Wenn der Parameterwert nicht NULL lautet, 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. Wenn der Wert FALSE lautet, kehrt der SQL Server Native Client OLE DB-Anbieter für die Sitzung zum Autocommitmodus zurück.

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

Für lokale Transaktionen implementiert der SQL Server Native Client OLE DB-Anbieter ITransaction::Commit-Parameter 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. Wenn der Wert FALSE lautet, kehrt der SQL Server Native Client OLE DB-Anbieter für die Sitzung zum Autocommitmodus zurück.

grfTC[in]

Die asynchrone Rückkehr und die Rückkehr zu Phase eins werden vom SQL Server Native Client OLE DB-Anbieter nicht unterstützt. Der SQL Server Native Client OLE DB-Anbieter gibt außer für XACTTC_SYNC für jeden Wert XACT_E_NOTSUPPORTED zurück.

grfRM[in]

Muss den Wert 0 (null) haben.

Die Rowsets des SQL Server Native Client OLE DB-Anbieters für die Sitzung werden bei einem lokalen Commit- oder Abbruchvorgang je nach den Werten für die Rowseteigenschaften DBPROP_ABORTPRESERVE und DBPROP_COMMITPRESERVE beibehalten. Standardmäßig lauten die Werte dieser Eigenschaften auf VARIANT_FALSE und gehen alle Rowsets des SQL Server Native Client OLE DB-Anbieters für die Sitzung bei 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.

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