También puedes ejecutar cada sql en una transacción distinta.
Yo lo hago así en Delphi:
Código Delphi
[-]
function DameTransactionRW(BaseDeDatos: TFIBDatabase; Q: TComponent = nil): TFIBTransaction;
begin
Result := TFIBTransaction.Create(Q);
with Result do
begin
DefaultDatabase := BaseDeDatos;
TRParams.Clear;
TRParams.Add('read_committed');
TRParams.Add('rec_version');
TRParams.Add('nowait');
end;
end;
function DameTransactionRO(BaseDeDatos: TFIBDatabase; Q: TComponent = nil): TFIBTransaction;
begin
Result := TFIBTransaction.Create(Q);
with Result do
begin
DefaultDatabase := BaseDeDatos;
TRParams.Clear;
TRParams.Add('read_committed');
TRParams.Add('read');
end;
end;
function DameId(Generador : string) : integer;
begin
with THYFIBQuery.Create(nil) do
begin
try
Close;
DataBase := DMMain.DataBase;
Transaction := DameTransactionRW(DMMain.DataBase);
try
if (not Transaction.InTransaction) then
Transaction.StartTransaction;
SelectSQL.Add('SELECT GEN_ID(' + Generador + ', 1) FROM RDB$DATABASE');
ExecQuery;
Result := FieldByName('GEN_ID');
Close;
Transaction.Commit;
finally
Transaction.Free;
end;
finally
Free;
end;
end;
end;