PDA

Ver la Versión Completa : Detectar un registro bloqueado


DavidR
06-12-2003, 00:29:18
Estimados Amigos:

Ante todo muchas gracias por la rápida respuesta que me dieron hace muy poco.

Ahora me plante en otro tema. Les recuerdo que trabajo en FireBird 1.5 y el C++Builder haciendo la conexión con ADO.


Tengo que realizar bloqueos de registros lo cual hago con moderado éxito usando el truco del UPDATE

Me ocurren dos problemas:
1- Logro hacer el UPDATE únicamente con un procedimiento almacenado cuando intento hacerlo desde un ADOQuery o un ADOCommand me da error. Esto es está bien, es normal? Desconozco si se puede invocar un UPDATE desde otro lado u otra forma.
2- Una vez que realizo el bloqueo el sistema se coloca en espera hasta que se libera el registro. Lo que necesito hacer es detectar previamente si ese registro está bloqueado y mostrar un cartel para que el usuario opte esperar o cancelar.

Desde ya agradezco su valiosísima ayuda
Afectuosos Saludos
David

rastafarey
08-12-2003, 18:28:57
Hasta donde se intebase no bloquea registros solo se editan versiones perso si lo haces pesimista mente se puede

esta esla forma de bloquearlos
SELECT ... FROM <algunatabla>
[WHERE ...]
[FOR UPDATE [OF ...]]
WITH LOCK;

y asi ves los bloqueados

i) (simple)
SELECT * FROM DOCUMENT WHERE ID=? WITH LOCK
ii) (varios registros, procesados uno a uno por un cursor DSQL)
SELECT * FROM DOCUMENT WHERE PARENT_ID=? FOR UPDATE WITH LOCK

pero creo que tu problema no es ese si te me explicas mejor te puedo ayudar.

Dime que error te sale.

si hacews commit o algo no se que mas decirte.

ok

espero respuesta a ver que se puede hacer

Lo referente al los bloqueos lo puedes encontrar en
http://www.ibphoenix.com/downloads/Firebird_v15.104_ReleaseNotesSpanish.pdf

DavidR
18-12-2003, 19:48:22
Estimado rastafarey

Gracias por responder. He tenidos problemas con internet y no pude contestar antes, mil disculpas.

El principal problema me sucede cuando después de ejecutar

SELECT * FROM DOCUMENT WHERE PARENT_ID=? FOR UPDATE WITH LOCK
(donde genero el bloqueo)

Luego cuando desde otra terminal quiero acceder a los registros bloqueados se detiene la aplicación y no continua hasta que los desbloqueo (finalizo la transferencia).

- Esto estaría bien para operaciones automatizadas pues la demora es necesaria y en todo caso imperceptible.
- Pero no es apropiada cuando quiero hacer una modificación manual como por ejemplo un ABM en donde el usuario quiere modificar datos de un cliente. Pues cuando oprime el botón modificar (y justo por esas cosas de la vida el registro esta bloqueado) se detiene la aplicación y el usuario no entiende nada y me reinicia la PC.

Para seleccionar un cliente uso
SELECT * FROM DOCUMENT WHERE PARENT_ID=?

Lo que necesitaría es que previamente pueda detectar que el registro que está siendo usado por otro usuario (antes que se paralice la aplicación).


Desde ya agradezco tu amable disposición
Muchísimas gracias
Y felices fiestas si no me pongo en contacto antes contigo.
Atte. David