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)
-   -   Ayuda a un neófito, por favor. (https://www.clubdelphi.com/foros/showthread.php?t=27117)

CarlosVF 11-11-2005 21:12:38

Ayuda a un neófito, por favor.
 
Saludos a todos; estoy haciendo unas pruebas de sincronización con Delphi e InterBase y para tal fin programé una pantalla que accede a una tabla DBF mediante ADO (previa creación de su ODBC) para que actualice su contenido en una tabla de una base de datos de InterBase 6.5, cuando hago cambios en la tabla de InterBase el programa a su vez actualiza la tabla DBF; hasta este punto todo de maravilla, el problema es cuando trato de que el programe lo ejecuten mas de un usuario a la vez; al tratar de entrar, específicamente cuando realiza la actualización de las DBF a InterBase en el línea del POST se queda pegado (se que es ahí porque lo corrí con debugger) hasta que cierro la otra aplicación, en ese momento la que estaba pegada sale para dar un error de "Deadlock on concurrent update" o algo así; será que por defecto se abre Exclusivo y me falta algo para que el acceso se abra Compartido? la verdad tengo sólo 2 días usando Delphi y desconozco mas de lo que me gustaría y una ayuda de parte del que pueda me vendría muy bien; estuve buscando aqui y me encontré con varios que hablan de algo llamado "IBExpert" y a pesar de que me da miedo preguntar pues me veo en la obligación de hacerlo, así que si me pueden ayudar con esas dos preguntas lo agradeceré mucho.

Gracias.

Lepe 12-11-2005 13:11:49

Viendo que es tu primer mensaje en el foro, Te damos la Bienvenida
Cita:

Empezado por CarlosVF
y a pesar de que me da miedo preguntar pues ..

... Y haces bien, cuando preguntan, solemos poner un barril de barro al fuego, con bastante agua y especias, llegado el herbor, arrojamos al forista dentro :D

"Deadlock on concurrent update"

Deadlock traducido es "Abrazo Mortal" en este caso en actualizaciones concurrentes.

Es como decir: Al llegar a un cruce de caminos, no tienes preferencia, tienes que esperar a que el otro pase. Me gustaría ver quien pasa primero.

Un proceso A tiene captado el recurso RA y el proceso B tiene captado el recurso RB, el proceso A necesita usar el recurso RB para terminar; el proceso B necesita el recurso RA para terminar.

Tendrás que pensar concurrentemente: cuando realizo este Post en interbase, ¿que ocurre si viene otro usuario haciendo el post sobre el DBF?

En cuanto al IBExpert, es un programa para crear/modificar el diseño de la base de datos Interbase/Firebird con interfaz gráfica. En su version personal es gratuito

saludos

Casimiro Notevi 12-11-2005 20:48:51

Lepe, me ha gustado tu explicación, clara y simpática

CarlosVF 13-11-2005 13:02:28

Saludos a todos; y gracias Lepe por tu atención; el concepto de concurrencia lo tengo muy claro, soy programador de Visual FoxPro y tengo algunos años de experiencia en el desarrollo de aplicaciones administrativas mas que todo; mi problema es que cuando hago el "POST" que supongo que es algo así como el equivalente al "TableUpdate" que se usa en Visual FoxPro para mandar los cambios que has hecho a tu base de datos bien sea a la Tabla o Vista que tengas abierta; mi gran problema es que no tengo idea de por qué podría quedarse pegado el programa cuando 2 personas hacen "POST" a una tabla; no se supone (teóricamente) que en concurrencia, la última actualización es la que queda en el registro?; supongo que en Delphi sigue siendo así, de modo que el único camino que queda es que algo me falta por hacer, por definir o por declarar; por un momento pensé que estaba abriendo la Base de Datos en forma exclusiva, porque en Visual FoxPro eso se puede hacer con la Base de Datos que viene nativa con él.

Gracias de todas maneras.

Lepe 13-11-2005 22:15:13

- Para acceder a DBF usas ADO, ¿para interbase? ¿que versión?
- Que tipo de transacción usas, commited, readcommited...
  1. AutoStopAction
  2. DefaultAction
- Que tipo de objetos, ibtable, ibdatasets, etc..
- En que sistema operativo estas ejecutándolo

Quizás un poco de código cuando realizas el post y los posibles triggers que tengas, ayude más.

nos leemos

CarlosVF 14-11-2005 13:31:40

Hola Lepe, gracias por tu ayuda; te cuento que hice una prueba por IBConsole desde 2 estaciones y cuando hice cambios a los registros de la tabla de la base de datos en una estación y luego trataba de hacer cambios desde la otra me salía un error de "Deadlock", hasta que hice "Commit & Refresh", supongo que a eso te referías cuando me preguntaste cuál tipo de Transacciones estoy usando; pues bien, te cuento que los valores de los parámetros que me preguntaste son estos:
Dentro del DataMódulo en el componente TIBDatabase en la propiedad DefaultTransaction están las siguientes propiedades con los siguientes valores:
AutoStopAction=saNone
DefaultAction=TACommit

Seguro que es algo que debo poner ahí y lo desconozco o quizás debo hacerlo por comandos en el programa.
De antemano muchas gracias por tu ayuda.

Carlos Vásquez

Lepe 14-11-2005 15:12:50

Pues ahora mira la ayuda de delphi sobre esas propiedades, si te lo digo yo, seguro que se me olvida algo.

En principio, deberías hacer un CommitRetaining, para que los cambios del primer usuario, sean accesibles directamente sobre el segundo usuario, y sobre el primer usuario sin hacer un Refresh.

PD: Esto no es tan facil, no es modificar una propiedad y listo, es un conjunto de propiedades, que según la filosofia de programación que uses y teniendo en cuenta lo que quieres hacer, deben establecerse de una forma u otra.

saludos

RONPABLO 14-11-2005 19:05:56

No seria mas combeniente usar componentes de conexión directa como IBX o MDOLib en lugar de usar ado??? el cambio no es mucho y si mejora el rendimiento!


La franja horaria es GMT +2. Ahora son las 02:55:22.

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