Partilhar via


Suporte a transações locais

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Base de dados SQL no Microsoft Fabric

Baixar driver OLE DB

Uma sessão delimita o âmbito da transação para uma transação local do Driver OLE DB para SQL Server. Quando, por orientação de um consumidor, o Driver OLE DB para SQL Server submete um pedido a uma instância ligada do SQL Server, o pedido constitui uma unidade de trabalho para o Driver OLE DB para SQL Server. As transações locais envolvem sempre uma ou mais unidades de trabalho numa única sessão do Driver OLE DB para SQL Server.

Usando o driver padrão OLE DB Driver para o modo de autocommit do SQL Server, uma única unidade de trabalho é tratada como o âmbito de uma transação local. Apenas uma unidade participa na transação local. Quando uma sessão é criada, o Driver OLE DB para SQL Server inicia uma transação para a sessão. Após a conclusão bem-sucedida de uma unidade de trabalho, o trabalho é comprometido. Em caso de falha, qualquer trabalho iniciado é revertido e o erro é reportado ao consumidor. Em qualquer dos casos, o Driver OLE DB para SQL Server inicia uma nova transação local para a sessão, de modo a que todo o trabalho seja realizado dentro de uma transação.

O Driver OLE DB para consumidor SQL Server pode direcionar um controlo mais preciso sobre o âmbito das transações locais utilizando a interface ITransactionLocal . Quando uma sessão de consumidor inicia uma transação, todas as unidades de trabalho de sessão entre o ponto de início da transação e as chamadas finais do método Commit ou Abort são tratadas como uma unidade atómica. O Driver OLE DB para SQL Server inicia implicitamente uma transação quando solicitado pelo consumidor a fazê-lo. Se o consumidor não solicitar retenção, a sessão reverte para o comportamento ao nível da transação pai, mais frequentemente no modo autocommitting.

O Driver OLE DB para SQL Server suporta os parâmetros ITransactionLocal::StartTransaction conforme segue.

Parâmetro Description
isoLevel[in] O nível de isolamento a ser usado com esta transação. Em transações locais, o Driver OLE DB para SQL Server suporta o seguinte:

ISOLATIONLEVEL_UNSPECIFIED

ISOLATIONLEVEL_CHAOS

ISOLATIONLEVEL_READUNCOMMITTED

ISOLATIONLEVEL_READCOMMITTED

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_CURSORSTABILITY

ISOLATIONLEVEL_REPEATABLEREAD

ISOLATIONLEVEL_SERIALIZABLE

ISOLATIONLEVEL_ISOLATED

ISOLATIONLEVEL_SNAPSHOT



Nota: A partir do SQL Server 2005 (9.x), ISOLATIONLEVEL_SNAPSHOT é válido para o argumento isoLevel se a versão está ou não ativada para a base de dados. No entanto, ocorrerá um erro se o utilizador tentar executar uma instrução e a versão não estiver ativada e/ou a base de dados não for apenas de leitura. Além disso, o erro XACT_E_ISOLATIONLEVEL ocorrerá se ISOLATIONLEVEL_SNAPSHOT for especificado como isoLevel quando ligado a uma versão do SQL Server anterior ao SQL Server 2005 (9.x).
isoFlags[em] O Driver OLE DB para SQL Server devolve um erro para qualquer valor que não seja zero.
pOtherOptions[in] Se não for NULL, o Driver OLE DB para SQL Server solicita o objeto options da interface. O OLE DB Driver para SQL Server devolve XACT_E_NOTIMEOUT se o membro ulTimeout do objeto options não for zero. O Driver OLE DB para SQL Server ignora o valor do membro szDescription .
pulTransactionLevel[out] Se não for NULL, o Driver OLE DB para SQL Server devolve o nível aninhado da transação.

Para transações locais, o Driver OLE DB para SQL Server implementa os parâmetros ITransaction::Abort da seguinte forma.

Parâmetro Description
pboidReason[em] Ignorado se definido. Pode ser NULL com segurança.
fRetenção[em] Quando TRUE, uma nova transação é implicitamente iniciada para a sessão. A transação deve ser comprometida ou terminada pelo consumidor. Quando FALSE, o Driver OLE DB para SQL Server reverte para o modo de autocommit para a sessão.
fAsync[in] O aborto assíncrono não é suportado pelo OLE DB Driver para SQL Server. O Driver OLE DB para SQL Server devolve XACT_E_NOTSUPPORTED se o valor não for FALSE.

Para transações locais, o OLE DB Driver para SQL Server implementa os parâmetros ITransaction::Commit da seguinte forma.

Parâmetro Description
fRetenção[em] Quando TRUE, uma nova transação é implicitamente iniciada para a sessão. A transação deve ser comprometida ou terminada pelo consumidor. Quando FALSE, o Driver OLE DB para SQL Server reverte para o modo de autocommit para a sessão.
grfTC[in] Retornos assíncronos e de fase um não são suportados pelo Driver OLE DB para SQL Server. O Driver OLE DB para SQL Server devolve XACT_E_NOTSUPPORTED para qualquer valor que não seja XACTTC_SYNC.
grfRM[in] Deve ser 0.

O Driver OLE DB para conjuntos de linhas do SQL Server na sessão é preservado numa operação local de commit ou aborto com base nos valores das propriedades do conjunto de linhas DBPROP_ABORTPRESERVE e DBPROP_COMMITPRESERVE. Por defeito, estas propriedades são ambas VARIANT_FALSE e todos os conjuntos de linhas do OLE DB Driver for SQL Server na sessão são perdidos após uma operação de aborto ou commit.

O Driver OLE DB para SQL Server não implementa a interface ITransactionObject . Uma tentativa do consumidor de recuperar uma referência na interface retorna E_NOINTERFACE.

Este exemplo utiliza 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.  

Ver também

Transações
Trabalhar com Isolamento de Snapshots