Jump to content


Photo

InTransaction Deadlock

Deadlock firebird

  • Please log in to reply
6 replies to this topic

#1 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 posts
  • LocationLa Ceiba-Atlantida-Honduras

Posted 28 November 2018 - 11:35 AM

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
  • 14460 posts
  • LocationMéxico

Posted 28 November 2018 - 12:34 PM

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
  • 418 posts
  • LocationLa Ceiba-Atlantida-Honduras

Posted 28 November 2018 - 01:43 PM

 
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
  • 6295 posts
  • LocationArgentina

Posted 09 December 2018 - 12:57 PM

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
  • 418 posts
  • LocationLa Ceiba-Atlantida-Honduras

Posted 10 December 2018 - 04:29 PM

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
  • 6295 posts
  • LocationArgentina

Posted 10 December 2018 - 06:54 PM

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

#7 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 posts
  • LocationLa Ceiba-Atlantida-Honduras

Posted 14 December 2018 - 02:08 PM

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,

Asi amigo:

MAIN.png

 

 

TS.png


  • 1





Also tagged with one or more of these keywords: Deadlock, firebird

IP.Board spam blocked by CleanTalk.