Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Duda sobre grabación de registros (https://www.clubdelphi.com/foros/showthread.php?t=93753)

Caminante 15-02-2019 14:45:38

Hola



Los componentes IBX (Que son los que uso) tienen una propiedad Intransaction que indica si ya esta iniciada una transaccion.



Código Delphi [-]
if not IBTransaction1.intransaction then
  IBTransaction1.startTransaction;

Supongo que los componentes que usas deben tener una propiedad similar.

engranaje 15-02-2019 14:50:46

Por si es de ayuda, solo apuntar que una conexión (TFDConnection) también puede estar en una transacción. Estás seguro de que todas tus transacciones son sobre TFDTransaction y no tienes ninguna sobre TFDConnection?

Casimiro Notevi 15-02-2019 18:06:31

Ya lo hemos comentado antes, si el componente base de datos/conexión tiene asociado ya un componente transaction, no tienes que hacerlo tú. Es lo que estamos intentando decirte todos desde el principio.
Código Delphi [-]
//  transacciones.StartTransaction;
  try
    qCuentas.ExecSQL;
//    Result:= 'Ok';
//    transacciones.commit;
  Except
    on E: exception do
    begin
//        transacciones.Rollback;
        raise;
    end;
  end;
Y eso, además, que no tenemos ni idea de lo que hace ese programa servidor.

Al González 15-02-2019 18:19:36

En un mensaje previo dices que el componente TFDConnection está en la aplicación servidor, y luego mencionas que lo usas en el lado cliente. Tal vez puedas aclararnos cómo está verdaderamente organizado tu proyecto.

Por otra parte, considera lo mencionado aquí:
Cita:

FireDAC supports nested transactions, so the current transaction is the one started with the most recent StartTransaction call. If the database does not support nested transactions, like most of DBMSs, then FireDAC emulates nested transactions using savepoints. CommitRetaining is useful only for the main transaction, not for nested ones.

The CommitRetaining call is the shortcut to Transaction.CommitRetaining, if the Transaction property is assigned. Otherwise, CommitRetaining will operate on default connection transaction.

Before calling CommitRetaining, an application may check the status of the InTransaction property. If an application calls CommitRetaining and there is no current transaction, an exception is raised.
E insisto: Haz una prueba aislada con UNA sola aplicación, una ventana, con un botón y todos los componentes mínimos dentro. Antes de distribuirlo en capas.

Saludos. :)

orodriguezca 16-02-2019 18:00:33

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;  //o algo parecido. generalmente lo hago en tiempo diseño en el modulo de datos
  transaccionesUpd.StartTransaction;
  try
    qCuentas.ExecSQL;
    Result:= 'Ok';
    transaccionesUpd.commit;
  Except
    on E: exception do
    begin
        transaccionesUpd.Rollback;
        raise;
    end;
  end;

usuario1000 18-02-2019 14:13:17

Gracias a todos por la información, voy a revisar lo que me habéis comentado y a hacer algunas pruebas.


Muy agradecido.


La franja horaria es GMT +2. Ahora son las 09:18:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi