Suporte a transações locais no SQL Server Native Client
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)
Uma sessão delimita o escopo da transação para uma transação local do provedor OLE DB do SQL Server Native Client. Quando, sob a direção de um consumidor, o provedor OLE DB do SQL Server Native Client envia uma solicitação para uma instância conectada do SQL Server, a solicitação constitui uma unidade de trabalho para o provedor OLE DB do SQL Server Native Client. As transações locais sempre encapsulam uma ou mais unidades de trabalho em uma única sessão do provedor OLE DB do SQL Server Native Client.
Usando o modo de confirmação automática padrão do provedor OLE DB do SQL Server Native Client, uma única unidade de trabalho é tratada como o escopo de uma transação local. Apenas uma unidade participa da transação local. Quando uma sessão é criada, o provedor OLE DB do SQL Server Native Client inicia uma transação para a sessão. Na conclusão bem-sucedida de uma unidade de trabalho, o trabalho é confirmado. Em caso de falha, qualquer trabalho começado é revertido e o erro é relatado ao consumidor. Em ambos os casos, o provedor OLE DB do SQL Server Native Client inicia uma nova transação local para a sessão para que todo o trabalho seja realizado em uma transação.
O consumidor do provedor OLE DB do SQL Server Native Client pode direcionar um controle mais preciso sobre o escopo da transação local usando a interface ITransactionLocal . Quando uma sessão do consumidor inicia uma transação, todas as unidades de trabalho da sessão entre o ponto inicial da transação e as eventuais chamadas do método Commit ou Abort são tratadas como uma unidade atômica. O provedor OLE DB do SQL Server Native Client inicia implicitamente uma transação quando instruído a fazê-lo pelo consumidor. Se o consumidor não solicitar retenção, a sessão reverterá para o comportamento pai em nível de transação, geralmente o modo de confirmação automática.
O provedor OLE DB do SQL Server Native Client dá suporte aos parâmetros ITransactionLocal::StartTransaction da seguinte maneira.
Parâmetro | DESCRIÇÃO |
---|---|
isoLevel[in] | O nível de isolamento a ser usado com esta transação. Em transações locais, o provedor OLE DB do SQL Server Native Client dá suporte ao seguinte: ISOLATIONLEVEL_UNSPECIFIED ISOLATIONLEVEL_CHAOS ISOLATIONLEVEL_READUNCOMMITTED ISOLATIONLEVEL_READCOMMITTED ISOLATIONLEVEL_REPEATABLEREAD ISOLATIONLEVEL_CURSORSTABILITY ISOLATIONLEVEL_REPEATABLEREAD ISOLATIONLEVEL_SERIALIZABLE ISOLATIONLEVEL_ISOLATED ISOLATIONLEVEL_SNAPSHOT Observação: do SQL Server 2005 (9.x) em diante, ISOLATIONLEVEL_SNAPSHOT é válido para o argumento isoLevel, independentemente de o controle de versão estar habilitado ou não para o banco de dados. Porém, ocorrerá um erro se o usuário tentar executar uma instrução e o controle de versão não estiver habilitado e/ou o banco de dados não for somente leitura. Além disso, o erro XACT_E_ISOLATIONLEVEL ocorrerá se ISOLATIONLEVEL_SNAPSHOT for especificado como o isoLevel quando conectado a uma versão do SQL Server anterior ao SQL Server 2005 (9.x). |
isoFlags[in] | O provedor OLE DB do SQL Server Native Client retorna um erro para qualquer valor diferente de zero. |
pOtherOptions[in] | Se não for NULL, o provedor OLE DB do SQL Server Native Client solicitará o objeto options da interface. O provedor OLE DB do SQL Server Native Client retornará XACT_E_NOTIMEOUT se o membro ulTimeout do objeto de opções não for zero. O provedor OLE DB do SQL Server Native Client ignora o valor do membro szDescription . |
pulTransactionLevel[out] | Se não for NULL, o provedor OLE DB do SQL Server Native Client retornará o nível aninhado da transação. |
Para transações locais, o provedor OLE DB do SQL Server Native Client implementa os parâmetros ITransaction::Abort da seguinte maneira.
Parâmetro | DESCRIÇÃO |
---|---|
pboidReason[in] | Ignorado se definido. Pode ser NULL com segurança. |
fRetaining[in] | Quando TRUE, uma nova transação é iniciada implicitamente para a sessão. A transação deve ser confirmada ou encerrada pelo consumidor. Quando FALSE, o provedor OLE DB do SQL Server Native Client reverte para o modo de confirmação automática da sessão. |
fAsync[in] | A anulação assíncrona não é suportada pelo provedor OLE DB do SQL Server Native Client. O provedor OLE DB do SQL Server Native Client retornará XACT_E_NOTSUPPORTED se o valor não for FALSE. |
Para transações locais, o provedor OLE DB do SQL Server Native Client implementa os parâmetros ITransaction::Commit da seguinte maneira.
Parâmetro | DESCRIÇÃO |
---|---|
fRetaining[in] | Quando TRUE, uma nova transação é iniciada implicitamente para a sessão. A transação deve ser confirmada ou encerrada pelo consumidor. Quando FALSE, o provedor OLE DB do SQL Server Native Client reverte para o modo de confirmação automática da sessão. |
grfTC[in] | Não há suporte para retornos assíncronos e de fase um pelo provedor OLE DB do SQL Server Native Client. O provedor OLE DB do SQL Server Native Client retorna XACT_E_NOTSUPPORTED para qualquer valor diferente de XACTTC_SYNC. |
grfRM[in] | Deve ser 0. |
Os conjuntos de linhas do provedor OLE DB do SQL Server Native Client na sessão são preservados em uma operação local de confirmação ou anulação com base nos valores das propriedades do conjunto de linhas DBPROP_ABORTPRESERVE e DBPROP_COMMITPRESERVE. Por padrão, essas propriedades são VARIANT_FALSE e todos os conjuntos de linhas do provedor OLE DB do SQL Server Native Client na sessão são perdidos após uma operação de anulação ou confirmação.
O provedor 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 usa 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.