Dando suporte a transações locais
Uma sessão delimita o escopo da transação para uma transação local do provedor OLE DB do SQL Server Native Client. Quando, na 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 quebram uma ou mais unidades de trabalho em uma única sessão do provedor OLE DB do SQL Server Native Client.
Usando modo de confirmação automática do provedor OLE DB do SQL Server Native Client padrão, uma única unidade de trabalho é tratada como 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. De qualquer maneira, o provedor OLE DB do SQL Server Native Client inicia uma nova transação local para a sessão, de forma que todo o trabalho é 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 uma transação implicitamente quando direcionado 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:
Observação
A partir do SQL Server 2005, 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.
|
isoFlags[in] |
O provedor OLE DB do SQL Server Native Client retorna um erro para qualquer valor diferente de zero. |
pOtherOptions[in] |
Se for diferente de NULL, o provedor OLE DB do SQL Server Native Client solicitará o objeto de opções da interface. O provedor OLE DB do SQL Server Native Client retornará XACT_E_NOTIMEOUT se o membro ulTimeout do objeto de opções for diferente de zero. O provedor OLE DB do SQL Server Native Client ignora o valor do membro szDescription. |
pulTransactionLevel[out] |
Se for diferente de 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 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 ao modo de confirmação automática para a sessão. |
fAsync[in] |
Não há suporte para a anulação assíncrona 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 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 ao modo de confirmação automática para a 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 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, as duas 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 perdidas após uma operação de anulação ou de 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.