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)
-   -   Problema con transacciones, sqlite y componentes ZEOS (https://www.clubdelphi.com/foros/showthread.php?t=64989)

zoide 13-11-2009 04:43:56

Problema con transacciones, sqlite y componentes ZEOS
 
Bueno resulta que estoy desarrollando un programa estilo punto de venta codificado en delphi 2007, uso DB sqlite3 y componentes zeos para la conexion, en la parte de registrar las ventas utilizo transacciones con un zquery, todo perfecto, el problema radica en que tengo un boton para que a mitad de venta puedan consultar la lista de productos con codigos, precios y cantidades de los mismos, pero resulta que si estoy a mitad de la venta y ya di de baja algunos productos (conectada con zquerys y extrayendo datos con selects) no me actualiza los datos, al parecer la transacción me bloquea los datos o mas bien bloquea la DB (incluso se genera un temporal de la DB cuando inicio la trancaccion, son geniales las transacciones :P) y no puedo ver actualizadas las cantidades sino hasta que termino la transaccón, pero lo mas extraño del asunto es que en mitad de venta uso una ztable para verificar la cantidad en almacen y no vender productos que no tengo, y ahi sii me manda los datos actualizados, si se vende un producto lo descuenta, he intentado bastantes cosas para refrescar estos datos en la consulta de productos cuando se bloquea por la transacción, pero al parecer nada funciona, no se que hacer, la verdad es muy importante esto para mi porque es mi trabajo para graduarme de la universidad, ojala puedan ayudarme, saludos y gracias.

Neftali [Germán.Estévez] 13-11-2009 11:23:47

La idea es que si estás en mitad de una transacción, y desde fuera consultas datos de tablas relacionados con la transacción puedes obtener cosas no coherentes; Dependiendo del Isolation Level que estés utilizando obtendrás fantasmas, lecturas sucias o incluso llegarás a bloqueos (como te está pasando).

Prueba a lanzar las consultas utilizando la misma transacción que tienes abierta.

rgstuamigo 13-11-2009 15:02:42

Cita:

Empezado por zoide (Mensaje 346483)
Bueno resulta que estoy desarrollando un programa estilo punto de venta codificado en delphi 2007, uso DB sqlite3 y componentes zeos para la conexion, en la parte de registrar las ventas utilizo transacciones con un zquery, todo perfecto, el problema radica en que tengo un boton para que a mitad de venta puedan consultar la lista de productos con codigos, precios y cantidades de los mismos, pero resulta que si estoy a mitad de la venta y ya di de baja algunos productos (conectada con zquerys y extrayendo datos con selects) no me actualiza los datos, al parecer la transacción me bloquea los datos o mas bien bloquea la DB (incluso se genera un temporal de la DB cuando inicio la trancaccion, son geniales las transacciones :P) y no puedo ver actualizadas las cantidades sino hasta que termino la transaccón, pero lo mas extraño del asunto es que en mitad de venta uso una ztable para verificar la cantidad en almacen y no vender productos que no tengo, y ahi sii me manda los datos actualizados, si se vende un producto lo descuenta, he intentado bastantes cosas para refrescar estos datos en la consulta de productos cuando se bloquea por la transacción, pero al parecer nada funciona, no se que hacer, la verdad es muy importante esto para mi porque es mi trabajo para graduarme de la universidad, ojala puedan ayudarme, saludos y gracias.

Te aconsejo leer y entender el concepto de lo que es ACID. y Bloqueos;)
Saludos...:)

zoide 13-11-2009 17:46:04

Cita:

Empezado por Neftali (Mensaje 346508)
La idea es que si estás en mitad de una transacción, y desde fuera consultas datos de tablas relacionados con la transacción puedes obtener cosas no coherentes; Dependiendo del Isolation Level que estés utilizando obtendrás fantasmas, lecturas sucias o incluso llegarás a bloqueos (como te está pasando).

Prueba a lanzar las consultas utilizando la misma transacción que tienes abierta.

Pues es que precisamente aun estoy dentro de la transacción cuando utilizo el zquery con un select para mostrar los datos en el dbgrid y ahí es cuando me salen datos no actualizados, no es que consulte la tabla de fuera.

zoide 13-11-2009 17:53:11

Cita:

Empezado por rgstuamigo (Mensaje 346526)
Te aconsejo leer y entender el concepto de lo que es ACID. y Bloqueos
Saludos...

Gracias por el interés, claro que comprendo lo que es acid y la exclusion mutua para evitar la concurrencia, solo que me parece extraño que usando componentes ztable accedo a los datos en mitad de una transacción y los maneja actualizados y en cambio con un zquery no ¿?.
Incluso he utilizado un programa externo para el manejo de la DB y con sentencias sql hago transacciones, inserto, elimno y consulto datos y si los maneja actualizados (osea que no es problema de sqlite), seria mas bien "problema con el zquery" por llamarlo de alguna manera.

rgstuamigo 13-11-2009 18:47:47

Cita:

Empezado por zoide (Mensaje 346555)
Gracias por el interés, claro que comprendo lo que es acid y la exclusion mutua para evitar la concurrencia, solo que me parece extraño que usando componentes ztable accedo a los datos en mitad de una transacción y los maneja actualizados y en cambio con un zquery no ¿?.
Incluso he utilizado un programa externo para el manejo de la DB y con sentencias sql hago transacciones, inserto, elimno y consulto datos y si los maneja actualizados (osea que no es problema de sqlite), seria mas bien "problema con el zquery" por llamarlo de alguna manera.

De acceder creo que vas a poder:rolleyes:, pero como te dice Neftali, no vas a obtener datos coherente;) por lo cual no es ideal hacerlo hasta que la transaccion sea commiteada(Commit) o cancelada(Roolback).;)
De todas formas tendrias que informarte como trabaja SQLite en en ese sentido.;)
Saludos...:)

Neftali [Germán.Estévez] 13-11-2009 18:55:07

Cita:

Empezado por zoide (Mensaje 346553)
Pues es que precisamente aun estoy dentro de la transacción cuando utilizo el zquery con un select para mostrar los datos en el dbgrid y ahí es cuando me salen datos no actualizados, no es que consulte la tabla de fuera.

¿Y seguro que esa consulta se hace utilizando esa misma transacción?

zoide 13-11-2009 19:09:58

Cita:

Empezado por Neftali (Mensaje 346561)
¿Y seguro que esa consulta se hace utilizando esa misma transacción?

Pues comienzo en un zquery la transacción, me puedo estar paseando por todo el programa y la transacción continua y hasta que no doy un rollback o un commit se guardan o cancelan cambios, por eso estoy seguro que aun esta dentro de la transacción y si no estuviera en la transaccion, se supone que ya estuviera commiteada o con un rollback y entonces con mayor razón me debería mostrar datos actualizados.

zoide 13-11-2009 19:13:16

Bueno aunque estube pensando, no hago el select con el mismo query que inicio la transacción, osea aun continuo en la transacción pero uso un query diferente, no se si eso tenga algo que ver ¿?, yo me supongo que no, pero puede que me equivoque.

zoide 13-11-2009 22:53:35

Parece que por fin encontré la solución a mi problema, resulta que no se porque diantres coloqué zconections por cada forma que tengo, eso quiere decir que tengo una por punto de venta y otra por busqueda de productos y al realizar la transacción en una zconnection esta bloquea la DB y en la segunda zconnection solo muestra informacion anterior a la transaccion, pero si uso la misma coneccion en la busqueda me muestra datos actuales durante la transaccion :D :D :D.

Gracias a las personas que intentaron ayudarme, aunque no nos entendieramos del todo :P y sobre todo por darme la idea de que tal vez los querys diferentes tenian algo que ver con el bloqueo, eso me llevo a las zconnections diferentes. Saludos.

Neftali [Germán.Estévez] 16-11-2009 13:10:05

Cita:

Empezado por zoide (Mensaje 346566)
...pero uso un query diferente, no se si eso tenga algo que ver ¿?, yo me supongo que no, pero puede que me equivoque.

Tiene que ver si está por una conexión diferente.

Cita:

Empezado por zoide (Mensaje 346580)
...eso me llevo a las zconnections diferentes.

Pues a eso es a donde quería llegar. ;)


La franja horaria es GMT +2. Ahora son las 19:01:40.

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