PDA

Ver la Versión Completa : ayuda en wait y nowait en transacciones


erickperez6
10-06-2014, 21:03:09
Saludos,

En pocas ocasiones los usuarios de mi aplicación obtienen un deadlock en la actualización de algunos registros que estoy consiente pueden coincidir en ciertos momentos, el tema es que me gustaría en vez de producirse el deadlock, la aplicacion espere que la transaccion que tiene "tomado" el registro termine (commit) para que la segunda proceda. La verdad es que el usuario de la transaccion que "esperara" a que la primera termine, casi no notara la espera porque mi aplicación realiza los commit casi inmediatamente cuando se actualiza algún registro. Los parámetros de mi transacción son:

write
nowait
concurrency

Probé cambiar el nowait por wait, pero todavía obtengo los deadlock, no se si para lograr lo que deseo debo de realizar otros cambios adicionales. :confused:

Casimiro Notevi
10-06-2014, 21:53:22
La verdad es que no debe suceder nunca un deadlock.

anubis
19-06-2014, 19:12:14
hola otra vez,

Estaba viendo este tema de las transacciones pero no me aclaro.

Uso componentes zeos y firebird.
en la conexion tengo seleccionada transacisolationleve como tireadcommitted.

A la hora de guardar un registro lo hago como

zquery.post;
zquery.applyupdates;
zquery.commitupdates;
zquery.refresh;


Funcionar funciona bien.

El programa tiene un apartado de venta que se usa en una computadora para ventas y por el otro lado, esta el administrador que va dando de alta los productos, compras etc.

Leyendo sobre el tema y sobre un comentario de Casimiro
El otro día un usuario (de clubdelphi) decía que tenía una BD de 10 gigas y que era algo lenta, le aconsejé hacer un backup/restore y volvió a la normalidad, además de ocupar menos de 400 megas, parece que nunca jamás había hecho "limpieza" de la BD :)
Te aconsejo que leas "EL" documento (http://www.intitec.com/varios/transacciones-0.2.6.pdf) por excelencia sobre transacciones.

Me he liado mas, porque zeos no tiene un componete de transacciones o si?.
estoy leyendo todo el post Transacciones en Zeos. Conviene una por Conexión ?, así como otros, pero si esta dificil, nose si lo que puse como hago las cosas es correcto o no, porque no uso transacciones, eso creo, y la finalidad es no cerrar la conexion a otros usuarios mientras el administrador da de alta o modifica para evitar el deadlock.

No se si me lo parece a mi, por lo que leo, que es un tema controvertido. El ejemplo del banco es muy bueno, se cierra automaticamente la transaccion para evitar conflictos.

En mi caso, y perdonad que me repita, si se usan dos computadoras, y en una se estan efectuando ventas de un minisuper, si el administrador por el otro lado esta modificando un registro que afecta tambien afecta, no puedo cerrar la transaccion de las ventas, debiera de ser todo transparente para los dos usuarios.

Mejor seria tenerlo todo en una misma computadora pero no es viable :(.

no se si me he explicado, pero que le tendria que añadir para que no hubiera problemas con el deadlock.
mientras voy a reeler el documento que compartio casimiro y bucear en el foro a ver si me aclaro. :).

Casimiro Notevi
19-06-2014, 19:46:00
Creo que estás un poco "perdido" :)

¿Qué componentes tiene Zeos? ¿ zDatabase, zTransaction, zQuery, zSql. ... ?

anubis
19-06-2014, 19:51:11
gracias por contestar,

si ando muy perdido, :(.

Uso componentes zeos, pero no hay ninguno de transacciones.

Zconnection, zquery y nada mas.

Casimiro Notevi
19-06-2014, 20:01:57
Supongo que ese zConecction vendrá a ser un Database + Transaction.

Mira esto (http://www.intitec.com/varios/A_ZEOS_basics_tutorial_not_only_for_firebird.pdf), esto (http://www.intitec.com/varios/zeos_demo_ma-de_esp.zip) y esto (http://www.clubdelphi.com/foros/showthread.php?t=78068).

anubis
20-06-2014, 04:04:41
Gracias Casimiro.
La cosa se complica ;).

El metodo del documento zeos recomienda la transaccion tiserializable para evitar problemas. La cuestion es que es una transaccion cerrada donde los demas usuarios no pueden acceder a ella hasta que se finalice.
Entiendo que, al no haber un procedimiento transaction, zconnection lo hace por ti segun el metodo que elijas, tan solo le metes un insert (eso no lo he leido, sino mas bien lo asumo porque no he visto otra opcion), y hasta que haces un commit o un roolback no acabas la transaccion.
Digo esto porque otros componentes para bases de datos no he usado puesto que uso lazarus, he oido que ibx esta disponible para lazarus tambien pero no lo he probado (tendre que hacerlo porque el acceso es mas rapido que con zeos, segun lo que publico Casimiro).

Bueno ya os dire mis indagaciones.

Casimiro Notevi
20-06-2014, 09:07:53
La verdad es que solamente conozco zeos de haber hecho algo sencillo, hace años.
Si puedes cambiar a IBX, hazlo :)