PDA

Ver la Versión Completa : trabajar misma BD con dos Ordenadores


GINMARMENOR
13-03-2022, 22:58:01
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:



dat.Datamodule.IbTablaPagares.open;



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


dat.Datamodule.IbTablaPagares.Append;


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


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:


[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:


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?

;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,


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.


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é.


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 (https://mega.nz/file/KQMjgDDJ#mtT0MoQ0Yj_64ZQxy-7YeXFSfTHlamqseL_x5Y4IrqI) 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.

HVliwq3T5F4