Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure SQL Database
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.