Partilhar via


Confirmando e revertendo transações

Para confirmar ou reverter uma transação em modo de confirmação manual, uma aplicação chama SQLEndTran. Os drivers de SGBDs que suportam transações normalmente implementam esta função executando uma instrução COMMIT ou ROLLBACK. O Gestor de Drivers não chama SQLEndTran quando a ligação está em modo de auto-commit; simplesmente devolve SQL_SUCCESS, mesmo que a aplicação tente reverter a transação. Como os drivers para SGBDs que não suportam transações estão sempre em modo de auto-commit, podem implementar SQLEndTran para devolver SQL_SUCCESS sem fazer nada ou optar por não o implementar de todo.

Observação

As aplicações não devem comprometer ou reverter transações ao executar instruções COMMIT ou ROLLBACK com SQLExecute ou SQLExecDirect. Os efeitos disto são indefinidos. Problemas possíveis incluem o driver já não saber quando uma transação está ativa, levando estas declarações a falharem em fontes de dados que não suportam transações. Estas aplicações devem chamar SQLEndTran em vez disso.

Se uma aplicação passar o handle de ambiente para SQLEndTran, mas não passar um handle de conexão, o Gestor de Drivers chamará conceptualmente SQLEndTran com o handle de ambiente para cada driver que tenha uma ou mais conexões ativas no ambiente. O driver então realiza o commit das transações em cada ligação no ambiente. No entanto, é importante perceber que nem o driver nem o Driver Manager realizam um commit em duas fases nas ligações do ambiente; isto é apenas uma conveniência de programação para chamar simultaneamente SQLEndTran para todas as ligações no ambiente.

(Um commit em duas fases é geralmente usado para confirmar transações distribuídas por várias fontes de dados. Na sua primeira fase, as fontes de dados são inquiridas para determinar se podem confirmar a sua parte da transação. Na segunda fase, a transação é efetivamente confirmada em todas as fontes de dados. Se alguma fonte de dados responder na primeira fase que não pode confirmar a transação, a segunda fase não ocorre.)