PDA

Ver la Versión Completa : Muchas transacciones al mismo tiempo error


muli
05-04-2008, 20:45:57
Estoy desarrollando un sistema de control de trabajos en una carpinteria, y todo funcionaba bien hasta que se puso un sistema de terminales ligeros que acceden a un servidor a traves de terminal server (thinstation), y claro en los terminales solo se ejecuta la aplicación ya al momento de iniciar, y cuando inician todas me salta el error del abrazo mortal en las transacciones, y eso que solo abro la transaccion cuando se inicia la aplicación, no hago ninguna consulta ni nada por el estilo.
Donde puede estar el error.
En firebird 1.5 con vista?
En el tipo de transaccion (read comminted nowait)?
En iniciar todos los terminales al mismo tiempo?
Le pondré que ejecute cada terminal en una carpeta distinta y atacando a la misma BD claro?

poliburro
05-04-2008, 22:41:45
En un entorno Cliente servidor dejas que los clientes controlen las transacciones? :eek: :eek::eek:

Eso es un grave error de diseño. Considera hacer uso de Sps.

Suerte

Casimiro Notevi
05-04-2008, 23:38:34
En un entorno Cliente servidor dejas que los clientes controlen las transacciones? :eek: :eek::eek:

Eso es un grave error de diseño. Considera hacer uso de Sps.

Suerte


Eso mismo pensé. Puede que el programa no estuviese ideado para trabajar cliente/servidor.

muli
07-04-2008, 10:06:57
Hombre, los clientes siempre tienen que hacer uso de transacciones, pues necesitan traer datos, tanto en un entorno c/s como en los otros, o acaso tu en una gestión c/s no haces uso de transacciones, haces todo con procedimientos almacenados?, permiteme que dude que se puede realizar la gran mayoria de las funciones de una gestión con procedimientos almacenados, y cuando realices algún cambio en la programación, arriesgarte a tocar la BD por un cambio que no sea significativo.
De todas formas y como en la variedad está el gusto, cada uno ataca de la forma que considera sus problemática y lo que planteé nunca me ha pasado con otros S.O. pues tengo entornos de gestión c/s en los cuales son más puestos y nunca me dieron abrazos mortales.

Sin más saluditos a todos.

Casimiro Notevi
07-04-2008, 21:16:16
¿Lo has seguido paso a paso para ver exactamente dónde está el problema?

brunoweb
07-04-2008, 23:22:21
¿Qué significa que "solo abres la transacción cuando se inicia la aplicación"?
Tené en cuenta que las transacciones debes cerrarlas tan pronto como puedas desde que fueron abiertas. Estando en un ámbito de trabajo monousuario puedes trabajar tranquilo, como lo venías haciendo, pero cuando los accesos son múltiples a la base de datos, se hace imperioso que la duración de las transacciones sea de apenas segundos.

Si este es el problema que tenés, abrir la transacción al iniciar y en forma automática sin ser necesaria y esperando que el usuario la cierre, entonces es muy probable que se dén estos infames deadlocks. Las soluciones o paleativos son muchos y variados.

Tendrías que dar algunos datos más, por ejemplo, con qué componente de acceso a datos estás trabajando. Yo tuve el problema de los deadlocks y lo resolví trabajando sobre las propiedades del IB_Transaction de IBObjects. Leyendo por ahí y allá, encontré que la mejor configuración de este componente es:

- Isolation=tiCommited
- RecVersion=False
- LockWait=True
- ServeAutoCommit=True

Esta última propiedad solo se puede establecer en True si la aplicación está accediendo desde otra pc en la red, ya que si te encuentras en la misma pc donde está la base de datos, el componente arroja error automáticamente.

También fíjate mucho en los triggers que si realizas una inserción/modificación simultánea desde dos terminales que dispare un trigger que toque la misma tabla y el mismo registro (la misma clave primaria), como puede ser un trigger de actualización de stock, el deadlock solo puede evitarse con la combinación de propiedades antes mencionada.

Bueno, espero haber ayudado, sino guíanos un poco más porque quizás entendí mal el problema.


Saludos.

poliburro
09-04-2008, 20:02:04
Hombre, los clientes siempre tienen que hacer uso de transacciones, pues necesitan traer datos, tanto en un entorno c/s como en los otros, o acaso tu en una gestión c/s no haces uso de transacciones, haces todo con procedimientos almacenados?, permiteme que dude que se puede realizar la gran mayoria de las funciones de una gestión con procedimientos almacenados, y cuando realices algún cambio en la programación, arriesgarte a tocar la BD por un cambio que no sea significativo.
De todas formas y como en la variedad está el gusto, cada uno ataca de la forma que considera sus problemática y lo que planteé nunca me ha pasado con otros S.O. pues tengo entornos de gestión c/s en los cuales son más puestos y nunca me dieron abrazos mortales.

Sin más saluditos a todos.

Opinión personal: Tu punto de vista sobre la transaccionalidad es errónea por que los cliéntes no debén ser los responsables de esta sino al contrario, el servidor debe ser el responsable de controlar las transacciones. Imagina una aplicación de 3 capas con SOAP. Los clientes deben controlar las transacciones?, por supuesto que NO, es a través de los procedimientos almacenados que las transacciones son controladas.


Con respecto a tu duda, puedo asegurarte que es posible realizar sistemas grandes utilizando unicamente procedimientos almacenados. :).

Suerte

muli
09-04-2008, 23:50:30
Lo que pasa que es se está desviando el tema hacia las aplicaciones en tres capas, pero mi duda inicial es con una aplicación en dos capas y ejecutandose en el mismo equipo, pues los terminales ligeros abren sesiones de terminal server y todo se ejecuta en el mismo equipo, de todas formas me parece que ya he solucionado el problema cerrando las transacciones en el momento justo.

Un saludo a todos.

poliburro
10-04-2008, 01:29:01
Lo que pasa que es se está desviando el tema hacia las aplicaciones en tres capas, pero mi duda inicial es con una aplicación en dos capas y ejecutandose en el mismo equipo, pues los terminales ligeros abren sesiones de terminal server y todo se ejecuta en el mismo equipo, de todas formas me parece que ya he solucionado el problema cerrando las transacciones en el momento justo.

Un saludo a todos.


Lo mismo aplica a las dos capas, de hecho tengo un ambiente similar en el trabajo, usuarios conectados a través de términal services que ejecutan aplicaciones en dos o tres capas, y toda la parte transaccional se encuentra en la base de datos.

delfib
11-04-2008, 02:06:49
Tambien puede ser usando los fibplus con dos transacciones

Transactions in InterBase/Firebird: how to use them in FIBPlus (part 1) (http://www.devrace.com/en/fibplus/articles/3286.php)
Transactions in InterBase/Firebird: how to use them in FIBPlus (part 2) (http://www.devrace.com/en/fibplus/articles/3292.php)
Transactions in InterBase/Firebird: how to use them in FIBPlus (part 3) (http://www.devrace.com/en/fibplus/articles/3305.php)
Transactions in InterBase/Firebird: how to use them in FIBPlus (part 4) (http://www.devrace.com/en/fibplus/articles/3520.php)

Saludos