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 31-03-2013
jpgonzalez jpgonzalez is offline
Miembro
 
Registrado: feb 2010
Posts: 121
Poder: 15
jpgonzalez Va por buen camino
Autocommit en ZConnection

Buenas para todos... estuve leyendo varios hilos que hablan de este tema, pero no he podido encontrar la respuesta o solución al problema que estoy teniendo al insertar datos en la BBDD con ZConnection.

Para explicar lo que me esta pasando usaré el ejemplo de las inserciones a varias tablas seguidas:
factura: tabla donde se inserta el encabezado de la factura
facturadetalle: tabla donde se inerta el detalle (los articulos que se facturaron)
pagos: tabla donde se inserta la forma de pago de la factura
articulos: que se utiliza solo para actualizar el stock

Código Delphi [-]
//El codigo esta simplificado al maximo para que no se haga muy larga la parte de codigo, cuando el tema es la conexion

   try
      DmMain.ZConnection.StartTransaction;
         .................................
         QryInsertarFactura.ExecSQL;
         .................................
         QryInsertarDetalleFactura.ExecSQL;
         .................................       
         QryActualizarStock.ExecSQL;
         .................................
         QryInsertarPago.ExecSQL;

      DmMain.ZConnection.Commit;
   except
      DmMain.ZConnection.Rollback;
      ShowMessage('No se ha podido guardar la factura.');
      abort;
   end;

Con este codigo, tenia la propiedad autocommit de ZConnection en true, lo que me generaba un problema de inconsistencia al guardar los datos en la BBDD.
En el ejemplo anterior, primero se inserta la factura, luego el detalle, luego se actualiza el stock y por ultimo se inserta el pago.
Supongamos que la factura, el detalle, y el stock se guarda bien, pero surge un error al guardar el pago.
En teoria, al tener todo en un StartTransaction/Commit no deberia guardar nada, pero al ver la BBDD me encontraba que las tres tablas que no tuvieron error se habian guardado... no se les habia hecho el Rollback a estas tablas.

Buscando en el foro, encontré que habia que poner el autocommit en falso, para que esto no ocurriera.
Poniendo el autocommit en falso, me tiraba otro error: Invalid operation in non AutoCommit mode
Buscando y leyendo encontré que ese error era debido al StartTransaction, ya que ese comando no era necesario cuando el autocommit estaba en falso.

Acto seguido comente esa linea (DmMain.ZConnection.StartTransaction), y solo deje el commit al final de las inserciones, pero cuando hice esto surgio algo nuevo: los datos aparentemente se guardaban, ya que debbugeando el código se ejecutaba todo a la perfección, pero al revisar la BBDD los datos no estaban.
Como si hubiera hecho un commit en memoria, y no lo hubiese posteado en la base.
Seguí buscando y leyendo pero no encontré la razón por la cual pasaba esto... encontre otros hilos que hablaban de commit suaves y commit duros, pero no logré encontrar la respuesta de porque el commit no posteaba en la base.

Mi problema, en resumen es el siguiente:
Si dejo el autocommit en true corro riesgo de generar inconsistencias en los datos de la BBDD, pero si lo pongo en false no puedo lograr que los datos que inserto se posteen en la base.

Espero haber sido claro... abrazo para todos!

Aclaracion; programo en Delphi XE, con ZConnection, MySQL y tablas InnoDB... y la propiedad del ZConnection--> TransactIsolationLevel = tNone
Responder Con Cita
  #2  
Antiguo 03-04-2013
jpgonzalez jpgonzalez is offline
Miembro
 
Registrado: feb 2010
Posts: 121
Poder: 15
jpgonzalez Va por buen camino
Buenas para todos...
Les comento que la version de Zeos que tenia era la 7.0.0-dev... en un foro de Zeos me dijeron que pruebe con la 7.0.3-stable, pero sigo teniendo el mismo inconveniente con el autocommit tanto en false como en true.

Será un problema de try/except???
No entiendo por que pasa que si tengo todas las inserciones dentro de un starttransaction/commit, inserte solo parte del bloque en lugar de TODO o NADA.

Seguire buscando... por ahora sin respuesta ni solucion. Abrazo!!!
Responder Con Cita
  #3  
Antiguo 04-04-2013
jorge82 jorge82 is offline
Baneado
 
Registrado: jun 2005
Ubicación: Mérida, Yucatán, México
Posts: 75
Poder: 19
jorge82 Va por buen camino
Yo utilizo la versión 7.0.3-stable con Firebird y Delphi 7 y siempre dejo ZConnection.AutoCommit en True, y luego si quiero manejar las transacciones explicitas lo hago con
Código Delphi [-]
ZConnection.StartTransaction;
try
   ...
  ZConnection.Commit;
except
  ZConnection.Rollback;
end;

es decir como en tu primer post, solo que dejando la propiedad AutoCommit en True y nunca he tenido problemas con la transacción o se guardan todos los cambios o no se guarda nada, eso si la propiedad TransactionIsolation la pongo a tiReadCommitted.
__________________
Un saludito.
Responder Con Cita
  #4  
Antiguo 04-04-2013
jpgonzalez jpgonzalez is offline
Miembro
 
Registrado: feb 2010
Posts: 121
Poder: 15
jpgonzalez Va por buen camino
Cita:
Empezado por jorge82 Ver Mensaje
Yo utilizo la versión 7.0.3-stable con Firebird y Delphi 7 y siempre dejo ZConnection.AutoCommit en True, y luego si quiero manejar las transacciones explicitas lo hago con
Código Delphi [-]
ZConnection.StartTransaction;
try
   ...
  ZConnection.Commit;
except
  ZConnection.Rollback;
end;

es decir como en tu primer post, solo que dejando la propiedad AutoCommit en True y nunca he tenido problemas con la transacción o se guardan todos los cambios o no se guarda nada, eso si la propiedad TransactionIsolation la pongo a tiReadCommitted.

Grande Jorge, grosoooooooooo!!!!
Poniendo la propiedad del TransactIsolationLevel en tiReadCommited anduvo a la perfeccion!!!.
Muchisimas gracias, la verdad que habia buscado en muchos lugares, posteado en ingles en foros de Zeos, Reconfigurado el MySQL, etc... ya no sabia mas que hacer.
Nuevamente, muy agradecido... abrazo!!!
Responder Con Cita
  #5  
Antiguo 04-04-2013
jorge82 jorge82 is offline
Baneado
 
Registrado: jun 2005
Ubicación: Mérida, Yucatán, México
Posts: 75
Poder: 19
jorge82 Va por buen camino
De nada, que bueno que ya se resolvió.
__________________
Un saludito.
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
Autocommit.... waly2k1 MySQL 15 31-03-2013 00:05:57
En FIBPlus uso de autocommit El_Raso Conexión con bases de datos 3 01-09-2011 00:10:51
Roles con zConnection Cañones Conexión con bases de datos 0 18-11-2009 21:39:10
Try Exception Zconnection JcTaztoman Conexión con bases de datos 5 16-11-2007 22:32:20
Cambiar Propiedades de ZConnection Maury Manosalva MySQL 4 12-12-2006 17:11:57


La franja horaria es GMT +2. Ahora son las 17:40:02.


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