Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Base de dados SQL no Microsoft Fabric
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.