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)
-   -   Transactions Firebird (https://www.clubdelphi.com/foros/showthread.php?t=29745)

Abel Garcia 31-01-2006 17:55:50

Transactions Firebird
 
Hola a todos, gracias por su ayuda, Estoy desarrollando una aplicacion en Firebird 1.5, y he llegado al punto donde tengo que programar pensando en varias aplicaciones modificando la base de datos al mismo tiempo, bueno tengo el tipico problema ¿ que pasa cuando dos aplicaciones intentan modificar la base de datos al mismo tiempo ?

Tengo entendido que Todas las aplicaciones pueden Ejecutar una lectura al mismo tiempo sin problema, estoy bien ?
el problema es que no todas pueden modificar al mismo tiempo, bueno la consulta es cual seria la forma de lograr esto, existe algun documento electronico en la red o que alguien pudiera mostrarme un codigo de ejemplo sencillo, actual mente estoy trabajando en Builder c++ 6.0, pero el codigo de ejemplo podria estar en Delphi tambien, espero haber sido claro con mi duda y muchas gracias por su ayuda. :confused:

jachguate 31-01-2006 20:49:15

Cita:

Empezado por Abel Garcia
Tengo entendido que Todas las aplicaciones pueden Ejecutar una lectura al mismo tiempo sin problema, estoy bien ?

correcto
Cita:

Empezado por Abel Garcia
el problema es que no todas pueden modificar al mismo tiempo

¡Momento! esto tiene sus matices. No mas de una transacción puede modificar el mismo registro al mismo tiempo, pero ningun conflicto ocurre si la transacción a modifica la existencia de las cocacolas mientras la transacción b modifica la de las lechugas... :D

Cita:

Empezado por Abel Garcia
bueno la consulta es cual seria la forma de lograr esto

No tengo ahora a mano ningún documento que pueda ayudarte... pero en general la regla es sencilla: Transacciones cortas y en la medida de lo posible, realizar actualizaciones en el mismo orden para evitar deadlocks (la transacción a modifica el registro 1, luego intenta modificar el 2 y se ve obligada a esperar porque ese registro fue modificado por la transacción b. Resulta que la transacción b modificó el registro 2 y luego intenta modificar el 1, pero este ya ha sido modificado por a. Resultado: un abrazo de la muerte (:D), es decir, un deadlock, donde a espera a b, pero b espera a a... Esto se evita logrando que tanto a y b actualicen primero 1 y luego 2.

Cuando una transacción modifica un registro, este queda bloqueado para cualquier otra transacción que intente modificarlo. El bloqueo es liberado cuando la transacción termina (con un commit o un rollback), por lo que conviene tener transacciones cortas en el tiempo. Si un programa inicia una transacción, modifica un registro, el usuario se va a tomar una taza de café y hacer la siesta, para luego regresar a modificar otro y hacer commit, todo se vuelve un caos. Para ello, es mejor mantener todas las modificaciones en memoria y luego enviarlas en un solo paso al servidor de base de datos. Existen varias técnicas para ellos, por ejemplo, podrías activar los cached updates o usar client datasets.

Te dejo hasta aqui, que ni soy bueno redactando, ni quiero perderte en un tema que está bien documentado y del que seguramente encontrarás información de mejor calidad.

Hasta luego.

;)

Abel Garcia 31-01-2006 21:46:57

Gracias
 
Muchas Gracias jachguate por tu respuesta, la verdad me ayudo mucho
y tienes razon no pasa nada cuando dos Transacciones Intentan modificar a un registro diferente, lo cual no es igual cuando intentan modificar al mismo registro. :) vbmenu_register("postmenu_128516", true);


La franja horaria es GMT +2. Ahora son las 15:52:08.

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