Saber si está bloqueado un registro

14/01/2005 - 11:31 por Keyhelp | Informe spam
Hola a todos:

Necesitamos saber si se puede consultar alguna tabla de sistema que te
permita sabe si un registro está bloqueado por update ( antes de hacer el
Commit ) de una determinada tabla

Me explico:
Tenemos dos usuarios ( cada uno en un puesto diferente ) en que pueden
consultar datos de una determinada tabla y modificarlo.

Cuando recuperamos esta información, la almacenamos en diversas variables
para poder manipularla, pero si los dos usuarios acceden a la vez, puede
suceder que los dos tengan los mismos datos antes de modificarlo, uno graba
el registro y cuando el otro lo graba machaca los datos con los suyos.

Por eso, habiamos pensado en que cuando uno de ellos recupere la
información, realice un UPDATE ( sin hacer commit hasta el final ) de un
determinado campo de ese registro, de forma que el otro usuario no pueda
modificarlo, pero sucede que cuando intenta recuperar esta información, se
queda esperando hasta que el otro termine, lo que deja su puesto bloquedao.
Es aqui donde queremos consultar si el registro que quiere modificar está
bloqueado o no, para darle al usuario un mensaje de información indicándole
que no puede porque otro usuario lo está modificando en ese momento.

Gracias por adelantado.

Francisco López
Dpt. Desarrollo
Keyhelp, S.L.
http://www.keyhelp.net

Preguntas similare

Leer las respuestas

#1 Enrique Albert
14/01/2005 - 12:37 | Informe spam
Hola,

Este problema se da muy a menudo, yo aconsejo una estrategia de
"refresco" donde la aplicacion antes de modificar un registro comprueba
si los datos han cambiado desde que fueron leidos.

Un primara solucion es añadir un campo datetime llamado
UltimaModificacion. Ahora bien, puede que sepas cuando el registro ha
cambiado, pero como gestionar que debe hacer la aplicacion cuando esto
ocurre puede ser laborioso.

Otra solucion es establecer un flag en el registro, el usuario tiene
que indicar que quiere editar un registro antes de hacer ninguna
modificacion, cuando esto ocurre el sistema actualiza el flag, si otro
usuario intenta editar el registro el sistema le indica que hay alguien
mas en el sistema editando el registro. Cuando se confirma o cancela el
proceso de ediccion entonces el flag vuelve a su estado normal.

Esta última solución es la que he visto mas a menudo.

No es un tema facíl de solucionar. Microsoft tiende a solucionar este
problema dejando abierto el recordset entre el cliente y el servidor,
puedes utilizar recordsets que se actualizan automaticamente. Pero como
todo, tiene muchas desventajas y la verdad que en aplicaciones de
tamaño medio a grande no lo recomiendo.

Saludos
Respuesta Responder a este mensaje
#2 Keyhelp
14/01/2005 - 13:26 | Informe spam
Gracias por la solución, pero no nos sirve.
Si hacemos el update para hacer la marca como indicas, tenemos que hacer el
COMMIT y no nos interesa hacerlo en ese momento ( el usuario puede hacer
varios proceso a la vez y no nos interesa que se grabe sin el consentimiento
del usuario ).
Además, si no hacemos el COMMIT, osea que dejamos el UPDATE solo para hacer
la marca, hasta que no se haga ROLLBACK o COMMIT, el registro queda
bloqueado.
Entonces si otro usuario quiere hacer una SELECT en que este registro
aparezca, dejará la SELECT esperando a que el usuario termine. y no
puede ser, por eso pedía que si existía alguna tabla en que se pudiese
determinar con antelación si un registro en concreto está bloqueado.

Gracias nuevamente por la respuesta.

"Enrique Albert" escribió en el mensaje
news:
Hola,

Este problema se da muy a menudo, yo aconsejo una estrategia de
"refresco" donde la aplicacion antes de modificar un registro comprueba
si los datos han cambiado desde que fueron leidos.

Un primara solucion es añadir un campo datetime llamado
UltimaModificacion. Ahora bien, puede que sepas cuando el registro ha
cambiado, pero como gestionar que debe hacer la aplicacion cuando esto
ocurre puede ser laborioso.

Otra solucion es establecer un flag en el registro, el usuario tiene
que indicar que quiere editar un registro antes de hacer ninguna
modificacion, cuando esto ocurre el sistema actualiza el flag, si otro
usuario intenta editar el registro el sistema le indica que hay alguien
mas en el sistema editando el registro. Cuando se confirma o cancela el
proceso de ediccion entonces el flag vuelve a su estado normal.

Esta última solución es la que he visto mas a menudo.

No es un tema facíl de solucionar. Microsoft tiende a solucionar este
problema dejando abierto el recordset entre el cliente y el servidor,
puedes utilizar recordsets que se actualizan automaticamente. Pero como
todo, tiene muchas desventajas y la verdad que en aplicaciones de
tamaño medio a grande no lo recomiendo.

Saludos
Respuesta Responder a este mensaje
#3 Enrique Albert
14/01/2005 - 14:07 | Informe spam
Me parece que no me he explicado bien. La solución que propuse no
utiliza la transacción como indicas.

Cada vez que un usuario inicia un proceso de edición tienes que
ejecutar un UPDATE para actualizar la marca, no bloquees el registro.

Cuando este proceso finaliza el usuario es el único que puede
modificar el registro, cuando termine entonces otro UPDATE modifica los
datos y "limpia" la marca, dejando a otros usuarios modificar el
registro siguiendo el mismo proceso.

Es un diseño similar a un MUTEX pero en una tabla y muy simple.

El problema es examinar si la aplicacion puede modificarse sin
demasiados cambios.

Saludos
Respuesta Responder a este mensaje
#4 Keyhelp
14/01/2005 - 14:12 | Informe spam
Creo que ya lo he entendido probaremos a ver que tal vá.

Gracias nuevamente.

"Enrique Albert" escribió en el mensaje
news:
Me parece que no me he explicado bien. La solución que propuse no
utiliza la transacción como indicas.

Cada vez que un usuario inicia un proceso de edición tienes que
ejecutar un UPDATE para actualizar la marca, no bloquees el registro.

Cuando este proceso finaliza el usuario es el único que puede
modificar el registro, cuando termine entonces otro UPDATE modifica los
datos y "limpia" la marca, dejando a otros usuarios modificar el
registro siguiendo el mismo proceso.

Es un diseño similar a un MUTEX pero en una tabla y muy simple.

El problema es examinar si la aplicacion puede modificarse sin
demasiados cambios.

Saludos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida