Dando suporte a transações locais
Uma sessão delimita o escopo da transação para uma transação local do provedor OLE DB SQL Server Native Client. Quando, na direção de um consumidor, o provedor OLE DB SQL Server Native Client envia uma solicitação a uma instância conectada de SQL Server, a solicitação constitui uma unidade de trabalho para o provedor OLE DB SQL Server Native Client. As transações locais sempre encapsulam uma ou mais unidades de trabalho em um único SQL Server Native Client sessão do provedor OLE DB.
Usando o padrão SQL Server Native Client modo de confirmação automática do provedor OLE DB, 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 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 SQL Server Native Client inicia uma nova transação local para a sessão para que todo o trabalho seja realizado dentro de uma transação.
O SQL Server Native Client consumidor do provedor OLE DB 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 direcionado para fazer isso 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: a partir do SQL Server 2005, ISOLATIONLEVEL_SNAPSHOT é válido para o argumento isoLevel se o controle de versão está ou não habilitado 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 isoLevel quando conectado a uma versão do SQL Server anterior a SQL Server 2005. |
isoFlags[in] | O provedor OLE DB 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 SQL Server Native Client retornará XACT_E_NOTIMEOUT se o membro ulTimeout do objeto options não for zero. O provedor OLE DB SQL Server Native Client ignora o valor do membro szDescription. |
pulTransactionLevel[out] | Se não for NULL, o provedor OLE DB SQL Server Native Client retornará o nível aninhado da transação. |
Para transações locais, o provedor OLE DB SQL Server Native Client implementa 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 é revertido para o modo de confirmação automática para a sessão. |
fAsync[in] | Não há suporte para anulação assíncrona pelo provedor OLE DB SQL Server Native Client. O provedor OLE DB SQL Server Native Client retornará XACT_E_NOTSUPPORTED se o valor não for FALSE. |
Para transações locais, o provedor OLE DB SQL Server Native Client implementa 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 é revertido para o modo de confirmação automática para a sessão. |
grfTC[in] | Não há suporte para os retornos assíncronos e de fase um do provedor OLE DB SQL Server Native Client. O provedor OLE DB 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 SQL Server Native Client na sessão são preservados em uma operação de confirmação ou anulação local 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 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 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.