Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-06-2004
sur-se sur-se is offline
Miembro
 
Registrado: may 2003
Posts: 212
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:50:33.


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
Copyright 1996-2007 Club Delphi