Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   trabajar misma BD con dos Ordenadores (https://www.clubdelphi.com/foros/showthread.php?t=95607)

GINMARMENOR 13-03-2022 22:58:01

trabajar misma BD con dos Ordenadores
 
Muy buenas

Estoy usando Delphi 2.010 y Firebird 2.5, tengo una IbDatabase, conectada a un IbTransaccion, de la Base de Datos he creado con el IbExpert una Tabla llamada IbTablaPagares.

El IbDatabase lo tengo abierto en diseño, la IbTablaPagares la abro al abrir el formulario FormPagarés donde meto los datos del siguiente modo:

Código Delphi [-]

                            dat.Datamodule.IbTablaPagares.open;

Para grabar cada registro utilizo la siguiente expresión al pulsar el botón Grabar:

Código Delphi [-]
                          dat.Datamodule.IbTablaPagares.Append;

Una vez que he terminado de introducir los datos, al salir del formulario hago lo siguiente.

Código Delphi [-]
                           dat.Datamodule.IbTablaPagares.close;


Mientras trabajo en el Pc1 todo va bien, en el Pc2 tengo grabado el mismo programa y se conecta a la base de datos que se encuentra en el Pc1, y me conecto del siguiente modo:

Código Delphi [-]
                           [BD]
                           path="xxx.xxx.x.xxx:C:\Pagares\"

Cuando trabajo sólo con el pc1 va bien, cuando trabajo sólo con el Pc2 también se conecta en red y a la base de datos del Pc1 y funciona bien.

El Conflicto viene cuando con el Pc1 y el Pc2 trabajando a la vez, aunque el Pc1 esté visualizando Reports y el Pc 2 esté introduciendo datos en el Formulario FormPagarés, dando el siguiente error:

Código Delphi [-]
                            dreadlock
                            update conflicts with concurrent update
                            concurrent transacttion number is 41449

Como veis es bastante sencillo, pero en red no consigo que funcione he buscado varias formas pero no hay forma. lo ideal sería que el programa pueda funcionar en los dos ordenadores trabajando en la misma tabla e ir grabando los registros en la misma tabla de forma sincronizada, como hay muchos programas que lo hacen, pero no sé si esto es posible

Gracias.

kuan-yiu 14-03-2022 08:27:45

¿Usas transacciones?

Neftali [Germán.Estévez] 14-03-2022 09:30:56

Estás generando bloqueos debido al uso de transacciones. IB/FB no es el sistema más claro en este sentido.
Yo te diría que primero leyesras un poco sobre cómo trabajan los componentes que estás utilizando (que no comentas cuales son) con las transacciones.

Aquí en el FTP del club, tienes bastantes documentos sobre el trabajado con FB:
https://terawiki.clubdelphi.com/Firebird/Documentos/

Y si buscas en los foros encontrarás hilos sobre el tema

Casimiro Notevi 14-03-2022 09:55:52

¿Y dónde están los 'post' y 'commit'?
¿Y qué parámetros tienes en los componentes de base de datos y de transacciones?

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 546002)
IB/FB no es el sistema más claro en este sentido.

Sin embargo, para mí es lo más sencillo e intuitivo que he visto :rolleyes:

GINMARMENOR 14-03-2022 23:05:28

Buenas,

Cita:

kuan-yiu

¿Usas transacciones?
Como había dicho uso un IbTransaction conectada a IbDatabase, mediante la propiedad defaultDatabase, no uso mas transacciones y ésta en concreto la única propiedad que he modificado es la de DefaultDatabase lo demás lo que viene por defecto.

Cita:

Casimiro Notevi

¿Y dónde están los 'post' y 'commit'?
¿ Y Qué parámetros tienes en los componentes de base de datos y de transacciones?

Como he dicho antes sólo pongo en formulario Ibdatabase e Ibtransacciones y la IbTablaPagarés tal cual

En la IbDatabase en la propiedad DefaultTransation pongo IbTransation1

En el IbTransation en la propiedad DefaultDatabase pongo IbDatabase1

Y la IbTablaPagarés en la propiedad Database pongo IbDatabase1

Todo lo demás es lo que viene por defecto no pongo ningún otro parámetro, ya que en modo local me funciona bien sin
problemas durante años, el problema es al trabajar con dos Pc, que al tener el mismo programa abierto en los
dos Pc se bloquean, pero no uso ningún parámetro más.

Los Post y los Commit, no sé exactamente qué son, ahora investigaré.
Cita:


Neftali [Germán.Estévez]

Estás generando bloqueos debido al uso de transacciones. IB/FB no es el sistema más claro en este sentido.
Yo te diría que primero leyesras un poco sobre cómo trabajan los componentes que estás utilizando (que no comentas
cuales son) con las transacciones.
Sí es cierto un bloqueo tengo que generar eso seguro, los componentes que utilizo son los que he comentado y al crearlos en formulario mantengo las propiedades por defecto no he modificado nada de ellos sólo la parte que los conecto entre ellos.

Y hay tres posibilidades

Si trabajo en el Pc1 sólo, funciona bien

Si trabajo en el Pc2 sólo, sin que el Pc1 tenga abierto el mismo programa funciona bien.

Si Trabajo en el Pc1 ó Pc2 teniendo los dos Pc's, con el programa abierto es cuando surge el bloqueo, sólo en ese momento.

No quiero dejarme un dato que necesitéis, pero esto es lo que hago, de forma sencilla, tengo que configurar algo en IbTransation, en IbDatabase, o IbTable, no utilizo más elementos a no ser que falte alguno.

Neftali [Germán.Estévez] 15-03-2022 09:36:49

Me da que estás generando una megatransacción que nunca cierras (Commit) y por eso te va dando bloqueos.

mamcx 15-03-2022 15:38:19

En otras palabras:

Una transacción esta optimizada para ser CORTA.

Mientras puedes tener la BD abierta por horas ( y eso de estar abriendo/cerrando la BD no necesariamente es lo mejor, A MENOS QUE uses un pool de conexiones) , debes "abrir" BEGIN y "cerrar" COMMIT por cada conjunto atómico de operaciones (ie: Por cada BATCH que debe guardarse en un solo conjunto). Eso significa que tu código debe tener varios encapsulamientos de BEGIN/COMMIT.


P.D: Es un anti-patron tener un el componente de transacciones "global". Eso debes estar creándolo todo el tiempo.

P.D2: Si estas arrancando, intenta siempre usar la ultima version del motor de datos :)

Casimiro Notevi 15-03-2022 16:50:02

Aquí tienes un ejemplo muy básico y simple para que te hagas una idea.
Ahí puedes ver los parámetros del componente IBDatabase y del IBTransaction.

Y aquí tienes una captura de pantalla simulando 2 ordenadores.



La franja horaria es GMT +2. Ahora son las 12:27: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