Fiz outro teste aqui e se houver algum erro dentro da transação (conversão, 
campo obrigatório, queda, ...), e não há qualquer SELECT dentro dela, o 
RollBack funciona perfeitamente. 

Tenho lido em alguns fóruns o pessoal reclamando que não faz Rollback, na 
verdade ele faz sim, desde que não exista qualquer SELECT antes do erro.

 Luciano Calenzani Simões





----- Mensagem original ----
De: Luciano Calenzani Simões <[EMAIL PROTECTED]>
Para: delphi-br@yahoogrupos.com.br
Enviadas: Quinta-feira, 29 de Maio de 2008 19:39:41
Assunto: [delphi-br] DBExpress x FireBird 2 x UIB FireBird15


O UIB FireBird15 para DBExpress com FireBird 2 tem problemas no gerenciamento 
de transação. Além daquele do campo BLOB já relatado nesta lista.

Explico: Se dentro do contexto da transação tiver um SQLDataSet/SQLQuery /... 
fazendo um select em uma tabela, ao executar o SQLDataSet.Close ele" commita" a 
transação, e continua o procedimento normalmente. Se ocorrer algum erro após 
esse SQLDataSet.Close, as operações de I/O que foram feitas no início não serão 
desfeitas, mesmo sendo executado o RoolBack. Não deve estar acreditando, na 
hora eu também não acreditei.

Fiz um teste com o mesmo código com o dirver Interbase e funciona 
perfeitamente. Mas esse driver não funciona perfeitamente com o FireBird 2.
Isso só acontece com operação de SELECT, se dentro da transação só tiver 
INSERT, UPDATE e DELETE irá funcionar perfeitamente.

Código exemplo (síntese):

begin
...
StartTransaction;
try
SQLDataSet1. CommandText := 'insert into table (codigo) values (1)';
SQLDataSet1. ExecSQL;
SQLDataSet1. Close;

SQLDataSet1. CommandText := 'select * from table';
SQLDataSet1. Open;
SQLDataSet1. Close; // Aqui ele comita a transação automaticamente.

// Quando chegar aqui, o 1º insert já está comitado, se houver erro daqui para 
frente ele não será desfeito.
SQLDataSet1. CommandText := 'insert into table (codigo) values (2)';
SQLDataSet1. ExecSQL;
SQLDataSet1. Close;

CommitWork;
except
RollBack;
end;
end;

Luciano Calenzani Simões



      Abra sua conta no Yahoo! Mail, o único sem limite de espaço para 
armazenamento!
http://br.mail.yahoo.com/

[As partes desta mensagem que não continham texto foram removidas]

Responder a