Flag para evitar acceso concurrente

11/12/2005 - 14:19 por Alfredo Crisostomo | Informe spam
Hola amigos.

En una aplicacion necesito tener acceso exclusivo a un form, es decir que si
un usuario lo tiene abierto, cuando otro usuario trate de abrir ese form
no se lo permita. Quiero hacerlo modificando un flag en un registro de una
tabla el cual lo seteo al entrar al form y lo reseteo al salir del form.
Bien hasta ahi bien pero el problema es cuando hay un crash total o parcial
de la terminal y la aplicacion aborta. Resulta entonces que el form queda
bloqueado y ningun usuario puede accesar.

Ufff. Como puedo resolver eso con sql server ? Ojo: se que hay otras
opciones desde la aplicacion como crear archivos y eso pero el problema es
que quiero hacerlo todo por la BD para evitar acceso indebido a directorios
del servidor.

Gracias.

Preguntas similare

Leer las respuestas

#6 Eladio Rincón
12/12/2005 - 09:36 | Informe spam
mira a ver si te sirve el procedimiento almacenado sp_getapplock:

BOL:
Locks placed on a resource are associated with either the current
transaction or the current session. Locks associated with the current
transaction are released when the transaction commits or rolls back. Locks
associated with the session are released when the session is logged out.
When the server shuts down for any reason, the locks are released.

Locks can be explicitly released with sp_releaseapplock. If an application
calls sp_getapplock multiple times for the same lock resource,
sp_releaseapplock must be called the same number of times to release the
lock.

If sp_getapplock is called multiple times for the same lock resource, but
specifies different lock modes, the effect on the resource is a union of the
two lock modes. In most cases, this means the lock mode is promoted to the
stronger of the existing mode and the newly requested mode. This stronger
lock mode is held until the lock is ultimately released, even if lock
release calls have occurred. For example, in the following sequence of
calls, the resource is held in Exclusive rather than Shared mode.

USE Northwind
GO
BEGIN TRAN
DECLARE @result int
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Shared'
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Exclusive'
EXEC @result = sp_releaseapplock @Resource = 'Form1'
COMMIT TRAN
mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\tsqlref.chm::/ts_sp_ga-gz_5gh5.htmSaludos,
Eladio Rincón

SQL Server MVP, Mentor
Solid Quality Learning
http://www.SolidQualityLearning.com

"Solid Quality Learning is the trusted global provider of advanced education
and solutions for the entire Microsoft database platform"


"Alfredo Crisostomo" wrote in message
news:OYmwOWl$
Hola amigos.

En una aplicacion necesito tener acceso exclusivo a un form, es decir que
si un usuario lo tiene abierto, cuando otro usuario trate de abrir ese
form no se lo permita. Quiero hacerlo modificando un flag en un registro
de una tabla el cual lo seteo al entrar al form y lo reseteo al salir del
form. Bien hasta ahi bien pero el problema es cuando hay un crash total o
parcial de la terminal y la aplicacion aborta. Resulta entonces que el
form queda bloqueado y ningun usuario puede accesar.

Ufff. Como puedo resolver eso con sql server ? Ojo: se que hay otras
opciones desde la aplicacion como crear archivos y eso pero el problema es
que quiero hacerlo todo por la BD para evitar acceso indebido a
directorios del servidor.

Gracias.

Respuesta Responder a este mensaje
#7 Eduardo Alvarado Meza
12/12/2005 - 09:37 | Informe spam
Todas las opciones anteriores tienen sentido, yo tengo una para el manejo de
la concurrencia. Lamentablemente la tengo con VB7.1, si lo programas con este
lenguaje, existe una DBConcurrency exception, que se dispara cuando las
versiones originales de los registros no son los mismos. Esto permite que
todos puedan ver los registros pero el primero que guarde tiene la prioridad.

Si otro intenta guardar despues, habra que advertirle el error de
concurrencia y refrescarle el registro.
En mi caso para los maestros/detalles, intento guardarle todos los detalles
y le señalo aquello que padecieron de errores de concurrencia y se los
refresco. Igual para el maestro. Ahora todo esto lo manejo en un formulario
"standard" que lo heredan todos mis formularios, por lo que el codigo lo
escribes una unica vez. Esto me permite crear un mestro/detalle los mas
sencillo con un minimo de 15 lineas de codigo, esto sin meter lo de las
ventanitas de agregar detalles, editar detalle, etc. Lo demas es puro binding.

Espero que te sirva la idea si lo estas haciendo en VB7.1 u 8
Respuesta Responder a este mensaje
#8 Alfredo Crisostomo
12/12/2005 - 11:32 | Informe spam
Si lo que deseas es bloquear un form, no hay nada que hacer en SQL Server
pues debes resolverlo a nivel de la programación de tu capa de
presentación (donde tienes el form).



Eso era lo que queria evitar pues implicaría crear el flag en un folder
compartido del servidor y tener que asignar acceso de escritura a todos los
usuarios a ese directorio.
Pero lo evaluare de todos modos.
Gracias.
Respuesta Responder a este mensaje
#9 Alfredo Crisostomo
12/12/2005 - 11:34 | Informe spam
Bien, pero eso aumenta la necesidad de soporte o de un usuario
administrador.

Gracias.

"qwalgrande" escribió en el mensaje
news:uzOahAm$
Hola.

Quizá pudieras crear una funcionalidad en tu aplicación que te permita
entrar a resetear el sistema, con un usuario administrador o algo así.
Este usuario podría entrar aún cuando el form esté en modo bloqueado.

qwalgrande


"Alfredo Crisostomo" escribió en el mensaje
news:OYmwOWl$
Hola amigos.

En una aplicacion necesito tener acceso exclusivo a un form, es decir que
si un usuario lo tiene abierto, cuando otro usuario trate de abrir ese
form no se lo permita. Quiero hacerlo modificando un flag en un
registro de una tabla el cual lo seteo al entrar al form y lo reseteo al
salir del form. Bien hasta ahi bien pero el problema es cuando hay un
crash total o parcial de la terminal y la aplicacion aborta. Resulta
entonces que el form queda bloqueado y ningun usuario puede accesar.

Ufff. Como puedo resolver eso con sql server ? Ojo: se que hay otras
opciones desde la aplicacion como crear archivos y eso pero el problema
es que quiero hacerlo todo por la BD para evitar acceso indebido a
directorios del servidor.

Gracias.





Respuesta Responder a este mensaje
#10 Alfredo Crisostomo
12/12/2005 - 11:36 | Informe spam
Gracias.
De hecho ese es el ultimo metodo que he implementado aunque si el usuario no
esta frente a su pc al momento de la caida o si no vuelve a entrar al
sistema de inmediato, puede quedar todavia bloqueado acceso por un tiempo
indefinido.


"Jorge Martinez" escribió en el mensaje
news:u4F9Lsm$
Otra cosa que puedes hacer es que cuando un usuario entre en tu aplicacion
resetee todos sus bloqueos.

Salu2

"Alfredo Crisostomo" escribió en el mensaje
news:OYmwOWl$
Hola amigos.

En una aplicacion necesito tener acceso exclusivo a un form, es decir que
si un usuario lo tiene abierto, cuando otro usuario trate de abrir ese
form no se lo permita. Quiero hacerlo modificando un flag en un
registro de una tabla el cual lo seteo al entrar al form y lo reseteo al
salir del form. Bien hasta ahi bien pero el problema es cuando hay un
crash total o parcial de la terminal y la aplicacion aborta. Resulta
entonces que el form queda bloqueado y ningun usuario puede accesar.

Ufff. Como puedo resolver eso con sql server ? Ojo: se que hay otras
opciones desde la aplicacion como crear archivos y eso pero el problema
es que quiero hacerlo todo por la BD para evitar acceso indebido a
directorios del servidor.

Gracias.





Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida