Ver Mensaje Individual
  #1  
Antiguo 22-06-2004
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Reputación: 22
sur-se Va por buen camino
Angry Transacciones y parámetros

Hola. He realizado un pequeño programa de prueba en Delphi 5 contra Firebird 1.03 utilizando IBX. El programa tiene un timer al que se la asigna un tiempo aleatorio (entre 1 y 3 segundos) de forma que en el evento del timer se produce el siguiente proceso:
1) Parar el timer
2) Iniciar transacción
3) update de un campo de unas tablas (se hace campo=campo+valor)
4) Aceptar transacción
5) Asignar un tiempo aleatorio al timer
6) habilitar el timer de nuevo.

La transacción tiene puestos los parámetros por defecto. Ejecuto el programa en varios ordenadores a la vez y obtengo al poco tiempo el error Deadlock. conflicts with concurrent update. En teoría este error no debería darlo, pues si se encuentra un recurso bloqueado durante una transacción debería hacer un "wait".
Suponiendo que no lo hace así, edito las propiedades de la transacción y le especifico los valores consistency y wait, para que haga las esperas. Lanzo la aplicación y obtengo el mismo error.

Cambio los componentes IBX por FIBPlus y da también errores de Deadlock (pero en menor medida), pero una vez que paro la aplicación y calculo cuantas veces se ha ejecutado la actualización en cada equipo veo que no coincide el valor final con el que debería ser.
Nota: cada vez que da error hago un rollback para deshacer la transacción.

Reviso los parámetros de las transacciones y creo que he puesto los correctos: consistency y wait que son los que me permiten lecturas repetibles y esperar frente a registros sucios. También lo pruebo con los parámetros por defecto que trae el componente de transacción.
Pues no entiendo porqué sucede esto. Y es un problema pues si las transacciones no funcionan bien, por ejemplo si varios procesos actualizan un saldo de forma simulatánea, no se garantiza que el valor final sea el correcto.
Primera pregunta: ¿esto es así o me estoy equivocando en algo? A la vista de las pruebas no sé que pensar.

Esto me lleva a plantearme la posibilidad de tener un tabla de semáforos para saber si puedo o no actualizar una tabla porque haya otro actualizándola. Pero claro, con la tabla de semáforos me encuentro en la misma situación al ser un recurso compartido. Es decir, necesitaría poder bloquear la tabla para acceso exclusivo. ¿Otro parámetro de la transacción "lock"?
Segunda pregunta: ¿como implemento un semáforo con tablas firebird?

Gracias.
Responder Con Cita