En Firebird todo lo que se hace contra la base de datos siempre está "cobjiado" en una transacción, incluso las sentencias select.
Yo suelo utilizar dos componentes de transacción diferentes, uno para las lecturas, que lo defino como la transacción por defecto de la conexión, y otro para las actualizaciones. En tu caso probaría a escribir el código así:
Código Delphi
[-]
qCuentas.Transaction := TransaccionesUpd; transaccionesUpd.StartTransaction;
try
qCuentas.ExecSQL;
Result:= 'Ok';
transaccionesUpd.commit;
Except
on E: exception do
begin
transaccionesUpd.Rollback;
raise;
end;
end;