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