Ir al contenido



Foto

InTransaction Deadlock

Deadlock firebird

  • Por favor identifícate para responder
5 respuestas en este tema

#1 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 406 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 28 noviembre 2018 - 11:35

Hola amigos, tengo un problema con las transacciones:


delphi
  1. if not (XssDM.MainTS.InTransaction) then
  2. XssDM.MainTS.StartTransaction;
  3. try
  4.  
  5. //// aqui instrucciones de insert y update lo usual
  6.  
  7. XssDM.MainTS.Commit;
  8. except
  9. on E: Exception do
  10. begin
  11. XssDM.MainTS.Rollback;
  12. ERRO_MSG := E.Message;
  13. MessageDlg(PCHAR('Ocurrio un error.' + #13 + E.MESSAGE), mtInformation, [mbOK], 0);
  14. lblHINT.Caption := 'Ocurrio un error al generar la transaccion...';
  15. lblHINT.Font.Color := clRed;
  16. exit;
  17. end;
  18. end;

el problema que tengo es que no detecta la instruccion InTransaction, si en dos computadoras ejecutan esa instruccion casi al mismo tiempo, la transaccion genera el deadlock, porque no espera a que la transaccion termine.,

 

estoy utilizando los componentes de interbase.

 

Saludos!


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.857 mensajes
  • LocationMéxico

Escrito 28 noviembre 2018 - 12:34

Hola amigos, tengo un problema con las transacciones:


delphi
  1. if not (XssDM.MainTS.InTransaction) then
  2. XssDM.MainTS.StartTransaction;
  3. try
  4.  
  5. //// aqui instrucciones de insert y update lo usual
  6.  
  7. XssDM.MainTS.Commit;
  8. except
  9. on E: Exception do
  10. begin
  11. XssDM.MainTS.Rollback;
  12. ERRO_MSG := E.Message;
  13. MessageDlg(PCHAR('Ocurrio un error.' + #13 + E.MESSAGE), mtInformation, [mbOK], 0);
  14. lblHINT.Caption := 'Ocurrio un error al generar la transaccion...';
  15. lblHINT.Font.Color := clRed;
  16. exit;
  17. end;
  18. end;

el problema que tengo es que no detecta la instruccion InTransaction, si en dos computadoras ejecutan esa instruccion casi al mismo tiempo, la transaccion genera el deadlock, porque no espera a que la transaccion termine.,
 
estoy utilizando los componentes de interbase.
 
Saludos!

 

 
Hola look, me parece que te da el error porque se ejecuta el bloque Try..Except con una transacción abierta por otro proceso. Es decir, debes asegurar que solo la transación que estás iniciando sea la que inserte o actualice tus datos.
 
 


delphi
  1. if not (XssDM.MainTS.InTransaction) then
  2. begin
  3.   XssDM.MainTS.StartTransaction;
  4.   try
  5.    
  6.     //// aqui instrucciones de insert y update lo usual
  7.  
  8.  
  9.     XssDM.MainTS.Commit;
  10.   except
  11.     on E: Exception do
  12.     begin
  13.       XssDM.MainTS.Rollback;
  14.       ERRO_MSG := E.Message;
  15.       MessageDlg(PCHAR('Ocurrio un error.' + #13 + E.MESSAGE), mtInformation, [mbOK], 0);
  16.       lblHINT.Caption := 'Ocurrio un error al generar la transaccion...';
  17.       lblHINT.Font.Color := clRed;
  18.       exit;
  19.     end;
  20.   end;
  21. end;

Pero más allá, deberías revisar porque traes una transacción abierta antes de hacer el INSERT/UPDATE.

Saludos


  • 0

#3 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 406 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 28 noviembre 2018 - 01:43

 
Hola look, me parece que te da el error porque se ejecuta el bloque Try..Except con una transacción abierta por otro proceso. Es decir, debes asegurar que solo la transación que estás iniciando sea la que inserte o actualice tus datos.
 
 


delphi
  1. if not (XssDM.MainTS.InTransaction) then
  2. begin
  3.   XssDM.MainTS.StartTransaction;
  4.   try
  5.    
  6.     //// aqui instrucciones de insert y update lo usual
  7.  
  8.  
  9.     XssDM.MainTS.Commit;
  10.   except
  11.     on E: Exception do
  12.     begin
  13.       XssDM.MainTS.Rollback;
  14.       ERRO_MSG := E.Message;
  15.       MessageDlg(PCHAR('Ocurrio un error.' + #13 + E.MESSAGE), mtInformation, [mbOK], 0);
  16.       lblHINT.Caption := 'Ocurrio un error al generar la transaccion...';
  17.       lblHINT.Font.Color := clRed;
  18.       exit;
  19.     end;
  20.   end;
  21. end;

Pero más allá, deberías revisar porque traes una transacción abierta antes de hacer el INSERT/UPDATE.

Saludos

 

Gracias amigo, pero el problema sigue. no se que podra ser, tendra que ver el dialieto de la base?.

es como que no detectara que hay otra computadora en transaccion y que debe esperar a que esa termine para continuar el proceso...


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.198 mensajes
  • LocationArgentina

Escrito 09 diciembre 2018 - 12:57

Hola Look,

No se que componentes estás empleando, pero deberías empezar a fijarte que parámetros están seteados para la transacción.

Justamente el Deadlook se produce cuando 2 o más transacciones están esperando el cierre de la otra. El uso del parámetro WAIT en la transacción podría conducir a eso.

 

Si nos dices que componentes usas, y la configuración que le estableciste podríamos tener una mejor idea del problema.

Saludos,


  • 0

#5 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 406 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 10 diciembre 2018 - 04:29

Hola Look,

No se que componentes estás empleando, pero deberías empezar a fijarte que parámetros están seteados para la transacción.

Justamente el Deadlook se produce cuando 2 o más transacciones están esperando el cierre de la otra. El uso del parámetro WAIT en la transacción podría conducir a eso.

 

Si nos dices que componentes usas, y la configuración que le estableciste podríamos tener una mejor idea del problema.

Saludos,

 

Hola amigo, estoy utilizando FireDac


  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.198 mensajes
  • LocationArgentina

Escrito 10 diciembre 2018 - 06:54

Yo aún ando familiarizandome con FireDAC pero vamos a hacer un esfuerzo para ver donde está el problema.

 

Te faltó la segunda parte de la respuesta, que es tan importante como la primera: decir como tienes configurado los componentes.

 

En buena parte, el problema podría estar en TFDTransaction. Empecemos a centrarnos en éste.

¿Cómo tienes configurado tu/s TFDTransaction? ¿En Isolation que valor tienes asignado? ¿Que parámetros adicionales tienes en Params? ¿Las propiedades AutoCommit, AutoStart y AutoStop están en true?

 

Cuanto más nos puedas decir sobre la configuración de dichos componentes, mas fácil será llegar al problema. Y quizá hasta se podría reproducirlo.

 

Saludos,


  • 0





Etiquetado también con una o más de estas palabras: Deadlock, firebird