PDA

Ver la Versión Completa : IB6 y ADO (transacciones)


LBriceno
05-05-2003, 04:43:13
Hola nuevo foro:

Quisiera retomar un tema que quedó pendiente en los foros anteriores...:)

Les cuento nuevamente. tengo una aplicación en Delphi5, con ADO y me conecto a una BD MSSQL7. Convertí mi BD a IB6 y con la misma app. (mediante ADO) me conecto usando un provider Oledb, hasta aqui todo bien....

El problema surge con las transacciones que abre IB, transacciones implícitas, ya que no se como cerrarlas (aceptarlas o anularlas). No es que desde la app. abra una transacción, sino que es la manera de trabajar de IB, que para cada consulta (lectura, borrado o actualización) comienza implicitamente una transacción....:(

Estas transacciones producen el bloqueo de los registros cuando acceden varios usuarios a la BD, por lo que es imposible seguir trabajando....:confused:

Tengo la duda si para solucionar este problema (si es que se puede solucionar) se deba hacer algo en la app. o configurar la BD. En la BD tengo la opción AutoCommit (o algo asi), pero no estoy sefuro por donde vaya el problema, en realidad recién estoy comenzando en IB.

Cualquier ayuda, guia, luz, etc. se agradece enormemente...

SAludos
LBP

kinobi
05-05-2003, 12:32:32
Hola,

Posteado originalmente por LBriceno
El problema surge con las transacciones que abre IB, transacciones implícitas, ya que no se como cerrarlas (aceptarlas o anularlas). No es que desde la app. abra una transacción, sino que es la manera de trabajar de IB, que para cada consulta (lectura, borrado o actualización) comienza implicitamente una transacción....:(
Es cierto que el servidor InterBase necesita estar dentro del contexto de una transacción para cualquier tipo de operación, incluidas las lecturas. Debe ser así para poder soportar la multiversión de registro, la llamada por Borland Aquitectura Multi-Generacional. Pero no es el servidor el que abre la transacción "implícita", es el propio cliente el que debe hacerlo. En tu caso serán los componentes ADO.

Posteado originalmente por LBriceno
Estas transacciones producen el bloqueo de los registros cuando acceden varios usuarios a la BD, por lo que es imposible seguir trabajando....:confused:
¿producen un bloqueo, o producen un error de actualización de los datos?. Aunque no imposible, no es habitual ver un interbloqueo entre transacciones.

No utilizo ADO, pero me da la impresión que es un problema de cómo estás configurando los componentes ADO para acceder al servidor.

Saludos.

LBriceno
05-05-2003, 16:06:39
Hola a todos:

Gracias Kinobi por contestar, siempre al rescate...

En realidad el problema que se presenta es un problema de actualización "deadlock-update conflicts with concurrent update", y este se produce cuando un usuario intenta modificar un registro
que fué modificado por otra aplicación, sin haber abierto desde la app. ninguna transacción, es decir, las transacciones que genera el servidor (arq. multigeneracional) no se cierran una vez realizados los cambios, o bien, cada conexión genera una transacción antes de siquiera leer algun registro.:confused:

Pregunta: ¿es necesario que las aplicaciones se conecten a la BD con distinto nombre de usuario?

Bueno a seguir machacando, o ¿son muy incompatibles ADO e IB?

Saludos y Gracias nuevamente...
Luis Briceño

kinobi
05-05-2003, 16:20:23
Hola,

Posteado originalmente por LBriceno
En realidad el problema que se presenta es un problema de actualización "deadlock-update conflicts with concurrent update", y este se produce cuando un usuario intenta modificar un registro
que fué modificado por otra aplicación,
Bien, hasta ahora es el comportamiento normal que debe tener el servidor.

Posteado originalmente por LBriceno
sin haber abierto desde la app. ninguna transacción,
¡Oh!, sí que la abre, sí; créeme.

Posteado originalmente por LBriceno
es decir, las transacciones que genera el servidor (arq. multigeneracional)
Bueno, como te comenté antes, es el cliente el que arranca la transacción (a través de una llamada a la función del API: isc_start_transaction o isc_start_multiple), no el servidor. Cuando hablamos de transacciones implícitas, nos referimos a transacciones que arranca el cliente automáticamente. En tu caso a través de los componentes ADO.

Posteado originalmente por LBriceno
no se cierran una vez realizados los cambios, o bien, cada conexión genera una transacción antes de siquiera leer algun registro.:confused:
Consejo: acostúmbrate a controlar tú explícitamente la apartura y cierre (commit o rollback) de las transacciones. En el caso concreto de ADO no sé cómo será, ya que no lo utilizo, pero con seguridad habrá algún método Start o StartTransaction y Commit y Rollback.

Posteado originalmente por LBriceno
Pregunta: ¿es necesario que las aplicaciones se conecten a la BD con distinto nombre de usuario?
No, incluso desde una misma aplicación pueden abrirse varias conexiones contra el servidor utilizando el mismo user/password.

Saludos.

Kafu
05-05-2003, 16:54:59
No he usado Ado contra Interbase, pero existe el método BeginTrans para el componente AdoConnection. Solía encerrar procesos que pudieran crear conflictos en bucles de reintentos con mensajes (esto a gusto del consumidor). Se intenta hacer un committrans y si no se puede, se hace un rollback y de nuevo a empezar. Siento lo poco preciso de mi comentario pero ya hace un tiempo que no lo hago y además fue con SQL-server, que es de Microsoft y supongo más compatible con Ado. No sé como se entenderán Interbase y ADO. Un saludo,

LBriceno
05-05-2003, 18:15:22
Hola nuevamente:

Gracias por sus comentarios.

Con respecto a las transacciones que arranca el cliente mediante un llamado a la API de IB, ¿como las puedo manejar?, ya que no se registran en el ADoConnection, al verificarlo con la propiedad InTransaction, me indica que no he comenzado ninguna trans. (como cuando se utiliza el método BeginTrans).

He probado efectuar cualquier lectura (borrado o actualización) de algún registro dentro de una Trans. explícita (es decir usando beginTrans,CommitTrans, RollBackTrans), pero me arroja los mismos resultados...:(

he intentado enviarle el comando Commit a través de un ADOCommand, pero me arroja un error desconocido....

¿Puede ser un problema del Provider (configuración) que utilizo (IBOleDb de Oledb.net)?, quizás me falta algún parámetro o algo?????:confused:

Bueno, hay que seguir hincándole el diente
Gracias nuevamente
Luis Briceño

LBriceno
06-05-2003, 16:03:16
Hola a todos:

Bueno, era lo que me esperaba.....:D He encontrado otros providers por la red y de momento hay un par que me soluciona este problema y hasta ahora funcionan bastante bien. Quizás debiera haber empezado por ahi....:rolleyes: ...

sin duda, valió la pena para aprender sobre el manejo de las transacciones y otras características de IB, que en realidad no sabia nada....:cool: (gracias a unos documentos de mr. Kinobi)

Gracias nuevamente y estamos en contacto

Salud...os
Luis Briceño