PDA

Ver la Versión Completa : Pregunta Teórica - Acceso simultaneo a tablas de una DB


MaMu
24-11-2007, 16:21:47
Necesito que alguien me diga o me oriente a cuales son los pasos correctos a seguir para conectarse a una base de datos de forma simultanea, es decir, realizar varias conexiones a una DB desde diferentes PC, y utilizando las mismas tablas. Yo quiero utilizar Access y mySQL.
El problema lo tengo en access, ya que si accedo a la misma tabla desde dos lugares, y modifico los datos desde uno de ellos, el otro acceso a la tabla me tira error. Lo que quiciera saber, es mas que nada a razgo general, o mas bien, a titulo de procedimiento. Aca es donde se involucran las transacciones?. Necesitaria una buena ayuda.

Les agradezco de antemano.

Saludos

AzidRain
24-11-2007, 17:09:44
En primer lugar olvídate de Access... eso es de la prehistoria además de que no merece el nombre de "motor de base de datos". Para eso nada mejor que MySQL o Firebird. Lo que tu estás conociendo se llama concurrencia y por supuesto que un buen motor de bd puede manejarla sin problemas. Vamos a ver que pasa:

1.- Terminales A y B hacen una consulta a un mismo registro cualquiera
1.- Terminal A hace una modificacion al registro
2.- Terminal B NO podrá ver el cambio realizado hasta que "refresque" su información, es decir, vuelva a consultar el registro. Sin embargo esto no produce ningún error.

Nótese que hablamos de un caso muy partícular, una misma tabla y un mismo registro. Pero si por ejemplo:

1.- Terminal A hace un cambio en un registro X de una tabla
2.- Terminal B hace un cambio en un registro Y de la misma tabla.

El motor se hace cargo y aplica los cambios de forma transparente por lo que no habrá ningún error. De hecho se pueden hacer toda clase de consultas al mismo tiempo al motor sin que se produzca ningún error.

MaMu
24-11-2007, 17:48:19
AzidRain, gracias por sacarme de la duda. Y como bien decis, me voy a volcar directamente a mySQL, y al uso de los componentes Zeos. Acabo de instalar mySQL 4.1 y estos ultimos y he probado la conexion y es exelente, sin ningun problema y/o error. (pruebo con 2 pc, en red inalambrica).

El tema es el siguiente, como puedo yo hacer una forma de refresco optima, es decir, por que metodo lo haria?. Supongamos que tengo el caso de:

1- Terminal A modifica el registro X de la tabla J
2- Terminal B visualiza el registro X de la tabla J

Quiciera poder hacer que, cuando A graba los cambios del registro X de la tabla J, automaticamente se actualicen y cambie el registro X de la tabla J visualizado por B.

Y que pasaria si A y B modifican al mismo tiempo el registro X de la tabla J???
Solo guarda el cambio efectuado por el primero que guarde de A o B?

Saludos

JXJ
25-11-2007, 20:52:12
El tema es el siguiente, como puedo yo hacer una forma de refresco optima, es decir, por que metodo lo haria?. Supongamos que tengo el caso de:

1- Terminal A modifica el registro X de la tabla J
2- Terminal B visualiza el registro X de la tabla J

Quiciera poder hacer que, cuando A graba los cambios del registro X de la tabla J, automaticamente se actualicen y cambie el registro X de la tabla J visualizado por B.


En este caso haz algo antes de insertar el nuevo dato para comprobar
si no a sido alterado por A, antes de que b ingrese el dato.

ya sea que mantengas por parte de B, el dato en una varible en memoria.
o que revises con un query si ese dato ya cambio y por quien


Y que pasaria si A y B modifican al mismo tiempo el registro X de la tabla J???
Solo guarda el cambio efectuado por el primero que guarde de A o B?


guarda el ultimo dato insertado. ya sea que fue A, el ultimo en modificar el dato
o fue B

AzidRain
04-12-2007, 18:56:39
Es un dilema que desde siempre ha existido en los motores de BD. Ninguno tiene una forma de "comunicar" automáticamente los cambios. Lo único que se puede hacer es refrescar la consulta (TZQuery tiene un método refresh que lo hace) para mostrar los pósibles cambios. Puedes hacer el refresco cada X tiempo o bien colocar alguna tabla semáforo donde indiques que hubo cambios pero de todas maneras tendrás que re-lanzar un query para revisar esto. Habría que ver con que frecuencia cambia el registro que deseas visualizar porque por ejemplo si estas visualizando un registro de un artículo a la venta que tiene un inventario de N piezas, obviamente si se vende alguno mientras lo estás viendo no verás el cambio a menos que refresques...esto es perfectamente normale en todos los sistemas, hasta en los de los grandes almacenes.

Hasta hoy no existe un visualizador en tiempo real de los cambios en una BD, y de hecho salvo aplicaciones de misión crítica o algo similar esto no tiene mayor problema.