Suporte a Transações Locais no Cliente Nativo do SQL Server

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse Analytics

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

Usando o modo de autocommit padrão do fornecedor OLE DB do SQL Server Native Client, 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 fornecedor do SQL Server Native Client OLE DB 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 fornecedor OLE DB do SQL Server Native Client 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 consumidor do fornecedor OLE DB do SQL Server Native Client pode dirigir 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 fornecedor de OLE DB do SQL Server Native Client 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 fornecedor do SQL Server Native Client OLE DB 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. Nas transações locais, o fornecedor Native Client OLE DB do 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 fornecedor do SQL Server Native Client OLE DB devolve um erro para qualquer valor que não seja zero.
pOtherOptions[in] Se não for NULL, o fornecedor do SQL Server Native Client OLE DB solicita o objeto options da interface. O fornecedor OLE DB SQL Server Native Client retorna XACT_E_NOTIMEOUT se o membro ulTimeout do objeto option não for zero. O fornecedor OLE DB do SQL Server Native Client ignora o valor do membro szDescription.
pulTransactionLevel[out] Se não for NULL, o fornecedor Native Client OLE DB do SQL Server devolve o nível aninhado da transação.

Para transações locais, o fornecedor do SQL Server Native Client OLE DB 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 fornecedor OLE DB do SQL Server Native Client reverte para o modo de autocommit da sessão.
fAsync[in] O aborto assíncrono não é suportado pelo fornecedor OLE DB do SQL Server Native Client. O fornecedor OLE DB SQL Server Native Client devolve XACT_E_NOTSUPPORTED se o valor não for FALSE.

Para transações locais, o fornecedor OLE DB do SQL Server Native Client 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 fornecedor OLE DB do SQL Server Native Client reverte para o modo de autocommit da sessão.
grfTC[in] Retornos assíncronos e de fase um não são suportados pelo fornecedor OLE DB do SQL Server Native Client. O fornecedor OLE DB de SQL Server Cliente Nativo retorna XACT_E_NOTSUPPORTED para qualquer valor que não seja XACTTC_SYNC.
grfRM[in] Deve ser 0.

Os SQL Server conjuntos de linhas do fornecedor Native Client OLE DB na sessão são preservados 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 SQL Server fornecedores do Native Client OLE DB na sessão são perdidos após uma operação de aborto ou commit.

O fornecedor OLE DB do SQL Server Native Client 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.