Unterstützen lokaler Transaktionen in SQL Server Native Client
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Eine Sitzung begrenzt den Transaktionsbereich für eine lokale SQL Server Native Client OLE DB-Anbietertransaktion. Wenn der SQL Server Native Client OLE DB-Anbieter in Richtung eines Consumers eine Anforderung an eine verbundene Instanz von SQL Server sendet, stellt die Anforderung eine Arbeitseinheit für den OLE DB-Anbieter von SQL Server Native Client dar. Lokale Transaktionen umschließen immer eine oder mehrere Arbeitseinheiten für eine einzelne OLE DB-Anbietersitzung von SQL Server Native Client.
Bei Verwendung des standardmäßigen AUTOCOMMIT-Modus 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. Wenn eine Sitzung erstellt wird, beginnt der OLE DB-Anbieter des SQL Server Native Client 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 OLE DB-Anbieter des SQL Server Native Client eine neue lokale Transaktion für die Sitzung, sodass alle Arbeiten innerhalb einer Transaktion durchgeführt werden.
Der OLE DB-Anbieter-Consumer des SQL Server Native Client kann mithilfe der ITransactionLocal-Schnittstelle eine präzisere Kontrolle über den lokalen Transaktionsbereich herstellen. 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 OLE DB-Anbieter des NATIVEn SQL Server-Clients beginnt implizit eine Transaktion, wenn er vom Consumer dazu weitergeleitet 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 OLE DB-Anbieter von SQL Server Native Client unterstützt wie folgt ITransactionLocal::StartTransaction-Parameter .
Parameter | BESCHREIBUNG |
---|---|
isoLevel[in] | Die innerhalb dieser Transaktion zu verwendende Isolationsstufe. In lokalen Transaktionen unterstützt der OLE DB-Anbieter von SQL Server Native Client 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 OLE DB-Anbieter des SQL Server Native Client gibt einen Fehler für einen anderen Wert als Null zurück. |
pOtherOptions[in] | Wenn nicht NULL, fordert der OLE DB-Anbieter des SQL Server Native Client das Optionsobjekt von der Schnittstelle an. Der OLE DB-Anbieter des nativen SQL Server-Clients gibt XACT_E_NOTIMEOUT zurück, wenn das ulTimeout-Element des Optionsobjekts nicht null ist. Der OLE DB-Anbieter von SQL Server Native Client ignoriert den Wert des szDescription-Elements . |
pulTransactionLevel[out] | Wenn nicht NULL, gibt der OLE DB-Anbieter des SQL Server Native Client die geschachtelte Ebene der Transaktion zurück. |
Für lokale Transaktionen implementiert der OLE DB-Anbieter von SQL Server Native Client 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 FALSE, wird der OLE DB-Anbieter des SQL Server Native Client auf den AutoCommit-Modus für die Sitzung zurückgesetzt. |
fAsync[in] | Der asynchrone Abbruch wird vom OLE DB-Anbieter des SQL Server Native Client nicht unterstützt. Der OLE DB-Anbieter von SQL Server Native Client gibt XACT_E_NOTSUPPORTED zurück, wenn der Wert nicht FALSE ist. |
Für lokale Transaktionen implementiert der OLE DB-Anbieter von SQL Server Native Client 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 FALSE, wird der OLE DB-Anbieter des SQL Server Native Client auf den AutoCommit-Modus für die Sitzung zurückgesetzt. |
grfTC[in] | Asynchrone rückgaben und Phase 1 werden vom OLE DB-Anbieter des SQL Server Native Client nicht unterstützt. Der OLE DB-Anbieter des SQL Server Native Client gibt XACT_E_NOTSUPPORTED für einen anderen Wert als XACTTC_SYNC zurück. |
grfRM[in] | Muss den Wert 0 (null) haben. |
Die SQL Server Native Client OLE DB-Anbieter-Rowsets 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 OLE DB-Anbieterzeilen von SQL Server Native Client in der Sitzung gehen nach einem Abbruch- oder Commitvorgang verloren.
Der OLE DB-Anbieter des nativen SQL Server-Clients 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.