Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   [FireDAC] lock conflict on no wait transaction deadlock update conflicts (https://www.clubdelphi.com/foros/showthread.php?t=93338)

ander 08-08-2018 12:42:33

[FireDAC] lock conflict on no wait transaction deadlock update conflicts
 
Tengo un TFDconnection y un TFDTransaction y a su vez varios TFDQuery .

En un principio, no tengo problemas para ejecutar este trozo de programa

Código Delphi [-]
procedure TFModulo.Write_New_Order(NUMPE:integer);
 begin
  New_Order.close;
  New_Order.SQL.clear;
  New_Order.SQL.add('UPDATE ORDERS SET N_FABRIC_S=:N_FABRIC_S,N_CLIENT_S=:N_CLIENT_S,CALIDAD=:CALIDAD');
  New_Order.SQL.add('WHERE N_PEDIDO='+''''+IntToStr(NUMPE)+'''');
  New_Order.ParamByName('N_FABRIC_S').AsString    := '1234';
  New_Order.ParamByName('N_CLIENT_S').AsString    := 'Pako';
  New_Order.ParamByName('CALIDAD')   .AsString      := 'Good';
  New_Order.EXECSQL;
  FModulo.FDTransaction.commitretaining;
 end;

Pero a cierto tiempo, me empieza a saltar este error :

Project prueba.exe raised exception class EIBNativeException with message '[FireDAC][Phys][FB] lock conflict on no wait transaction deadlock update conflicts with concurrent update

y no hay manera que se restablezca de nuevo.
Salgo del programa y vuelvo arrancarlo ,va bien de nuevo (con los mismos datos).

Alguna idea de que puede ser???

Windows 10 , Delphi 10.2 y Firebird 2.5

Casimiro Notevi 08-08-2018 13:42:13

Pues hay algo que no se está haciendo bien con las tracciones, difícil decirte exactamente sin ver el código ni los parámetros de los distintos componentes.
Haz una búsqueda en los foros con la palabra deadlock, a ver si encuentras "inspiración".
Mira los enlaces relacionados que están al final de esta página, abajo del todo.

ASAPLTDA 08-08-2018 17:54:02

Lock Conflicto
 
Código Delphi [-]
procedure TFModulo.Write_New_Order(NUMPE:integer);
 begin
 
  FModulo.FDTransaction.commitretaining;
 end;

Pero a cierto tiempo, me empieza a saltar este error : Lock Conflicto

Hola he tenido dificultad en migrar de los componentes sql-direct a firedac en el manejo de transacciones

Uno de los problemas es con el CommitRetaining el cual graba los datos en la base de datos que solo son visibles para el programa que graba la informacion, si otro pograma o en otra terminal se hacen los cambios al mismo archivo podria tener diferencias, y los hace visible los cambios cuando sales del programa. Podrias revisar si solo con cambiar a commit el problema se solucciona.

Ten en cuenta como tienes definido el componente de conexion a la base de datos , si autocommit o no.

No se si cuando usas el insert en el archivo se disparen triggers que afecten a otros archivos

mi skype es logisticasoft

Saludes desde Cali Colombia

Casimiro Notevi 08-08-2018 19:21:19

¿Estás contestando a ander, o estás haciendo tu propia pregunta?

ASAPLTDA 09-08-2018 16:28:42

Sobre commit
 
Comparto mi experiencia con la cual podría buscar la solución al problema, saludes

ander 09-08-2018 16:59:52

Cita:

Empezado por ander (Mensaje 527987)
Tengo un TFDconnection y un TFDTransaction y a su vez varios TFDQuery .

En un principio, no tengo problemas para ejecutar este trozo de programa

Código Delphi [-]
procedure TFModulo.Write_New_Order(NUMPE:integer);
 begin
  New_Order.close;
  New_Order.SQL.clear;
  New_Order.SQL.add('UPDATE ORDERS SET N_FABRIC_S=:N_FABRIC_S,N_CLIENT_S=:N_CLIENT_S,CALIDAD=:CALIDAD');
  New_Order.SQL.add('WHERE N_PEDIDO='+''''+IntToStr(NUMPE)+'''');
  New_Order.ParamByName('N_FABRIC_S').AsString    := '1234';
  New_Order.ParamByName('N_CLIENT_S').AsString    := 'Pako';
  New_Order.ParamByName('CALIDAD')   .AsString      := 'Good';
  New_Order.EXECSQL;
  FModulo.FDTransaction.commitretaining;
 end;

Pero a cierto tiempo, me empieza a saltar este error :

Project prueba.exe raised exception class EIBNativeException with message '[FireDAC][Phys][FB] lock conflict on no wait transaction deadlock update conflicts with concurrent update

y no hay manera que se restablezca de nuevo.
Salgo del programa y vuelvo arrancarlo ,va bien de nuevo (con los mismos datos).

Alguna idea de que puede ser???

Windows 10 , Delphi 10.2 y Firebird 2.5

Gracias por vuestras respuestas
Me he pasado muchas horas mirando y haciendo pruebas con los componentes de firedac y me han surgido muchas dudas al respecto. Cuando usaba los componentes de Interbase no había tenido tantos problemas.
Lo curioso que con un TFDconnection y un TFDTransaction al hacerle FDTransaction.commit me surgía el error y si lo hacia con el FDconnection.commit me hace bien y no me da ningún error ( curioso ). Estos dos componentes están dentro de un Datamodule con algún TFDQuery . Imaginaos que tengo este Datamodule y un Form (que es el principal) y en este Form genero un programilla con una consulta e implemento el Datamodule, para acceder al TdConnection ect... Con ese programilla hago un 'Update' pero los datos en la tabla no se actualizan( ni con el commit) ,se actualizan cuando se sale del programa y vuelvo a entrar (cosa que no sucede cuando el programilla se encuentra en el datamodule ).
¿Puede ser porque en el Datamodule se han generado en el uses, todas las llamadas al firedac y en el Form no ? (No los sé)
Seguiré probando.

ASAPLTDA 09-08-2018 18:47:46

Uso de conección y transacción con firebird
 
Cuando usted usa el componente transacción debe tener en cuenta que firebird a diferencia de otras bases de datos puede manejar varias transacciones simultaneas, por lo que debe uno ser muy cuidadoso al usar el componente fdtradacton, por eso yo solo uso connecion para manejar las transacciones


La franja horaria es GMT +2. Ahora son las 10:10:47.

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