Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Muchas transacciones al mismo tiempo error (https://www.clubdelphi.com/foros/showthread.php?t=55026)

muli 05-04-2008 20:45:57

Muchas transacciones al mismo tiempo error
 
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

Cita:

Empezado por poliburro (Mensaje 277850)
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

Cita:

Empezado por muli (Mensaje 277942)
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

Cita:

Empezado por muli (Mensaje 278783)
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)
Transactions in InterBase/Firebird: how to use them in FIBPlus (part 2)
Transactions in InterBase/Firebird: how to use them in FIBPlus (part 3)
Transactions in InterBase/Firebird: how to use them in FIBPlus (part 4)

Saludos


La franja horaria es GMT +2. Ahora son las 07:57:29.

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