Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-07-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Rollback de trigger si falla mi transacción

Buen día, agradezco el tiempo que te tomas para leer mi problema, espero opines o me des un indicio para resolverlo.

Tengo 3 insert a diferentes tablas mysql (t1, t2, t3) mediante una transacción debido a que se relacionan por medio de un folio y deben insertarse los 3 o ninguno.

En t2 tengo un trigger after insert.

Entonces si mi transacción falla en el insert t3 mi trigger en t2 ya se ejecutó, al hacer rollback no se inserta la información en t1,t2 y t3 pero mi trigger ya hizo su tarea.

Cómo puedo hacer rollback en mi trigger si mi transacción hace rollback ?


Gracias de antemano. Saludos.
Responder Con Cita
  #2  
Antiguo 22-07-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En teoría, con cualquier base de datos que cumpla con las normas sql (firebird, postgresql, oracle, mssql, etc.) no tendrías que hacer nada, supongo que será alguna característica de mysql.

Me parece recordar que mysql tiene varias "formas" distintas de trabajar, seguramente va por ahí el asunto.

Última edición por Casimiro Notevi fecha: 22-07-2021 a las 13:21:14.
Responder Con Cita
  #3  
Antiguo 22-07-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.272
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿Con qué BBDD estás trabajando?
Lo lógico tal como comenta [Casimiro] es que si los INSERT van en la misma transacción, los triggers asociados se incluyan en esa misma transacción, por lo tanto, el rollback debería deshacerlo todo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 22-07-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Gracias Casimiro y gracias Neftalí por sus respuestas.

Neftalí estoy trabajando con MySQL.

Leyendo sus comentarios recordé que las transacciones en MySQL las tablas deben ser InnoDB y mis 3 tablas (t1,t2 y t3) si son pero el trigger en t2 que envía información a otra tabla después del insert es MyISAM entonces pienso que pudiese ser que por eso el rollback no se aplica en ella.

Mi código delphi no tiene nada de extra ordinario:

Código Delphi [-]
      // Inicia la TRANSACCION 
      ZServidor.StartTransaction;

      try
      // Envío la info del cobro al Servidor
      // hostname es el nombre del servidor a donde se va a enviar la información

      tabla := 'cobro';
      TransactionOfInformation(tabla, ZLQuery1.FieldByName('hostname').AsString); 

      // Envío la info de la movimiento al Servidor
      tabla := 'movimiento';
      TransactionOfInformation(tabla, ZLQuery1.FieldByName('hostname').AsString);

      // Envío la info del detalle del movimiento al Servidor
      tabla := 'detalle';
      TransactionOfInformation(tabla, ZLQuery1.FieldByName('hostname').AsString);

      ZServidor.Commit;
      except on E: Exception do
        begin 
           ZServidor.Rollback;
           ShowMessage(E.ClassName+' error raised, with message : '+E.Message+#10#13+
           'Si continúa recibiendo éste error DETENGA el SERVICIO');
        end;
      end;


Y el trigger en la tabla detalle envía información a otra tabla que es MyISAM que concentra datos para reportes.
Cambiaré el motor de almacenamiento, haré pruebas y les comento.

Muchas gracias por su tiempo.
Responder Con Cita
  #5  
Antiguo 22-07-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ethangio Ver Mensaje
Leyendo sus comentarios recordé que las transacciones en MySQL las tablas deben ser InnoDB y mis 3 tablas (t1,t2 y t3) si son pero el trigger en t2 que envía información a otra tabla después del insert es MyISAM entonces pienso que pudiese ser que por eso el rollback no se aplica en ella.

Efectivamente, a eso me refería con este comentario:
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Me parece recordar que mysql tiene varias "formas" distintas de trabajar, seguramente va por ahí el asunto.
A ver si es eso.
Responder Con Cita
  #6  
Antiguo 22-07-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Gracias infinitas

Las tablas deben ser InnoDB para que el rollback las afecte.

Éste hilo se puede cerrar.

Saludos y nuevamente gracias por su tiempo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
commit y rollback anubis Varios 0 22-08-2012 15:26:38
RollBack Retaining marcial Firebird e Interbase 2 18-11-2008 21:02:29
RollBack con más de una transacción kikodelphi MS SQL Server 2 12-10-2005 20:24:25
Uso adecuado de Rollback rochi Firebird e Interbase 4 20-11-2004 20:10:55
Un fallo en un Trigger ¿ deshace la transacción ? guillotmarc Firebird e Interbase 2 03-09-2003 15:01:59


La franja horaria es GMT +2. Ahora son las 21:01:20.


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
Copyright 1996-2007 Club Delphi