Stöd för lokala transaktioner i SQL Server Native Client

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

En session avgränsar transaktionsomfattningen för en lokal transaktion med SQL Server Native Client OLE DB-leverantör. När SQL Server Native Client OLE DB-leverantören på uppdrag av en konsument skickar in en förfrågan till en ansluten instans av SQL Server, utgör förfrågan en arbetsenhet för SQL Server Native Client OLE DB-leverantören. Lokala transaktioner omsluter alltid en eller flera arbetsenheter på en enda SQL Server Native Client OLE DB-leverantörssession.

Med standardläget för autocommit i SQL Server Native Client OLE DB behandlar en enda arbetsenhet som omfattningen av en lokal transaktion. Endast en enhet deltar i den lokala transaktionen. När en session skapas påbörjar SQL Server Native Client OLE DB-leverantören en transaktion för sessionen. Efter att en arbetsenhet har slutförts framgångsrikt genomförs arbetet i arbetet. Vid misslyckande rullas allt påbörjat arbete tillbaka och felet rapporteras till konsumenten. I båda fallen startar SQL Server Native Client OLE DB-leverantören en ny lokal transaktion för sessionen så att allt arbete utförs inom en transaktion.

Konsumenten av SQL Server Native Client OLE DB-leverantör kan styra mer exakt kontroll över det lokala transaktionsområdet genom att använda ITransactionLocal-gränssnittet. När en konsumentsession initierar en transaktion behandlas alla sessionsarbetsenheter mellan transaktionens startpunkt och de slutliga Commit - eller Abort-metodanropen som en atomär enhet. SQL Server Native Client OLE DB-leverantören påbörjar implicit en transaktion när konsumenten ber om det. Om konsumenten inte begär retention återgår sessionen till föräldratransaktionsnivåbeteende, oftast autocommitt-läge.

SQL Server Native Client OLE DB-leverantören stöder ITransactionLocal::StartTransaction-parametrarna enligt följande.

Parameter Description
isoLevel[in] Isoleringsnivån som ska användas vid denna transaktion. Vid lokala transaktioner stöder SQL Server Native Client OLE DB-leverantören följande:

ISOLATIONLEVEL_UNSPECIFIED

ISOLATIONLEVEL_CHAOS

ISOLATIONLEVEL_READUNCOMMITTED

ISOLATIONLEVEL_READCOMMITTED

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_CURSORSTABILITY

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_SERIALIZABLE

ISOLATIONLEVEL_ISOLATED

ISOLATIONLEVEL_SNAPSHOT



Obs: Från och med SQL Server 2005 (9.x) gäller ISOLATIONLEVEL_SNAPSHOT för isoLevel-argumentet oavsett om versionshantering är aktiverad för databasen eller inte. Dock uppstår ett fel om användaren försöker köra en sats och versionshantering inte är aktiverad och/eller databasen inte är skrivskyddad. Dessutom uppstår felet XACT_E_ISOLATIONLEVEL om ISOLATIONLEVEL_SNAPSHOT anges som isoLevel när den är ansluten till en version av SQL Server tidigare än SQL Server 2005 (9.x).
isoFlags[in] SQL Server Native Client OLE DB-leverantören ger ett fel för alla värden utom noll.
pOtherOptions[in] Om det inte är NULL, begär SQL Server Native Client OLE DB-leverantören optionsobjektet från gränssnittet. Den SQL Server Native Client OLE DB-leverantören returnerar XACT_E_NOTIMEOUT om optionsobjektets ulTimeout-medlem inte är noll. SQL Server Native Client OLE DB-leverantören ignorerar värdet på medlemmen szDescription.
pulTransactionLevel[out] Om det inte är NULL, returnerar SQL Server Native Client OLE DB-leverantören den nästlade nivån för transaktionen.

För lokala transaktioner implementerar SQL Server Native Client OLE DB-leverantören ITransaction::Abort-parametrarna enligt följande.

Parameter Description
pboidReason[in] Ignoreras om det är satt. Kan säkert vara NULL.
fBehåller[in] När det gäller SANT påbörjas en ny transaktion implicit för sessionen. Transaktionen måste genomföras eller avslutas av konsumenten. När FELAKTIGT går SQL Server Native Client OLE DB-leverantören tillbaka till autocommit-läge för sessionen.
fAsync[in] Asynkron avbrytning stöds inte av SQL Server Native Client OLE DB-leverantören. Den SQL Server Native Client OLE DB-leverantören returnerar XACT_E_NOTSUPPORTED om värdet inte är FALSKT.

För lokala transaktioner implementerar SQL Server Native Client OLE DB-leverantören ITransaction::Commit-parametrar enligt följande.

Parameter Description
fBehåller[in] När det gäller SANT påbörjas en ny transaktion implicit för sessionen. Transaktionen måste genomföras eller avslutas av konsumenten. När FELAKTIGT går SQL Server Native Client OLE DB-leverantören tillbaka till autocommit-läge för sessionen.
grfTC[in] Asynkrona och fas ett-returer stöds inte av SQL Server Native Client OLE DB-leverantören. Den SQL Server Native Client OLE DB-leverantören returnerar XACT_E_NOTSUPPORTED för alla värden som inte XACTTC_SYNC.
grfRM[i] Måste vara 0.

De SQL Server Native Client OLE DB-leverantörens raduppsättningar på sessionen bevaras i en lokal commit- eller avbrytoperation baserat på värdena för raduppsättningens egenskaper DBPROP_ABORTPRESERVE och DBPROP_COMMITPRESERVE. Som standard är dessa egenskaper både VARIANT_FALSE och alla raduppsättningar SQL Server Native Client OLE DB-leverantören på sessionen förloras efter en avbryt- eller commit-operation.

SQL Server Native Client OLE DB-leverantören implementerar inte ITransactionObject-gränssnittet. Ett konsumentförsök att hämta en referens på gränssnittet ger E_NOINTERFACE.

Detta exempel använder 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.