Compartilhar via


Efeito de transações em cursores e instruções preparadas

Confirmar ou reverter uma transação tem um dos seguintes efeitos sobre cursores e planos de acesso:

  • Todos os cursores são fechados e os planos de acesso para instruções preparadas nessa conexão são excluídos, ou

  • Todos os cursores são fechados e os planos de acesso para instruções preparadas nessa conexão permanecem intactos, ou

  • Todos os cursores permanecem abertos e os planos de acesso para instruções preparadas nessa conexão permanecem intactos.

Por exemplo, suponha que uma fonte de dados exiba o primeiro comportamento dessa lista, o mais restritivo desses comportamentos. Agora suponha que um aplicativo faça o seguinte:

  1. Define o modo de confirmação como confirmação manual.

  2. Cria um conjunto de resultados de ordens de venda na instrução 1.

  3. Cria um conjunto de resultados das linhas em uma ordem de venda na instrução 2, quando o usuário realça essa ordem.

  4. Chama SQLExecute para executar uma instrução de atualização posicionada que foi preparada na instrução 3, quando o usuário atualiza uma linha.

  5. Chama SQLEndTran para confirmar a instrução de atualização posicionada.

Devido ao comportamento da fonte de dados, a chamada para SQLEndTran na etapa 5 faz com que ele feche os cursores nas instruções 1 e 2 e exclua o plano de acesso em todas as instruções. O aplicativo deve executar novamente as instruções 1 e 2 para recriar os conjuntos de resultados e preparar novamente a instrução na instrução 3.

No modo de confirmação automática, funções diferentes de SQLEndTran confirmam transações:

  • SQLExecute ou SQLExecDirect No exemplo anterior, a chamada para SQLExecute na etapa 4 confirma uma transação. Isso faz com que a fonte de dados feche os cursores nas instruções 1 e 2 e exclua o plano de acesso em todas as instruções nessa conexão.

  • SQLBulkOperations ou SQLSetPos No exemplo anterior, suponha que na etapa 4 o aplicativo chame SQLSetPos com a opção SQL_UPDATE na instrução 2, em vez de executar uma instrução de atualização posicionada na instrução 3. Isso confirma uma transação e faz com que a fonte de dados feche os cursores nas instruções 1 e 2, além de descartar todos os planos de acesso nessa conexão.

  • SQLCloseCursor No exemplo anterior, suponha que, quando o usuário realça uma ordem de venda diferente, o aplicativo chama SQLCloseCursor na instrução 2 antes de criar um resultado das linhas para a nova ordem de venda. A chamada para SQLCloseCursor confirma a instrução SELECT que criou o conjunto de resultado das linhas e faz com que a fonte de dados feche o cursor na instrução 1 e, em seguida, descarta todos os planos de acesso nessa conexão.

Os aplicativos, especialmente os baseados em tela nos quais o usuário rola o conjunto de resultados e atualiza ou exclui linhas, devem ter cuidado para codificar esse comportamento.

Para determinar como uma fonte de dados se comporta quando uma transação é confirmada ou revertida, um aplicativo chama SQLGetInfo com as opções SQL_CURSOR_COMMIT_BEHAVIOR e SQL_CURSOR_ROLLBACK_BEHAVIOR.