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

#11 Alfredo Crisostomo
12/12/2005 - 11:39 | Informe spam
Gracias por la sugerencia aunque tambien tendria que depender de que la PC
del crash vuelva a entrar al sistema. A veces no siempre puede ser inmediato
el reingreso a la PC caida.

"yodelmis" escribió en el mensaje
news:%23jJW6bs$
Saludos Alfredo

Para este problema se me la variante que acontinuacion explico:

1. el la base de datos creo una tabla que Tenga la siguiente estructura
(NombreFormulario,MaquinaQueBloquea,fechahoradebloqueo)
Nota: con esta tabla podria controlar todos los formularios que quieras

2.Cuando el Usuario Carga La aplicacion, se verifica si el nombre de la
maquina esta bloqueando algun formulario y de ser asi resetea los campos
MaquinaQueBloque y fechahoradebloqueo
Nota: cuando el usuario termina de trabajar con el formulario dichos
valores se deben resetear, para que otros usuarios lo puedan utilizar.

3.cuando un usuario encuentra que el formulario esta bloquedo se calcula
el tiempo transcurrido desde el valor almacenado en el campo
fechahoradebloqueo y la hoar actual. Si el tiempo transcurrido es mayor
que 1 hora se resetearan la variables.


espero que esta solucion te sea util.




Respuesta Responder a este mensaje
#12 Alfredo Crisostomo
12/12/2005 - 11:43 | Informe spam
No digo que no tengas razon, uno debe hacer los sistemas siempre teniendo en
cuenta lel manejo de la concurrencia, sin embargo, mi caso es un form que
requiere que el usuario visualice unos balances en la pantalla antes de
salvarse el registro, debido a que si durante el registro otro usuario
modifica algun balance en otro registro, puede provocar problemas. Es una
corta explicacion pero realmente es un caso un poco sui generis y exigido
asi por el cliente.


"José Antonio" escribió en el
mensaje news:OP5ZpAv$
Y todos esto de bloquear formularios, para que lo utilizais?

Nunca me he visto en la necesidad de hacerlo.


"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
#13 Alfredo Crisostomo
12/12/2005 - 11:44 | Informe spam
Gracias, lo voy a chequear. De hecho me extrañaba que no existieria algo
para "bloquear" en SQL server.

"Eladio Rincón" escribió en el mensaje
news:O1$45cv$
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
#14 Alfredo Crisostomo
12/12/2005 - 11:44 | Informe spam
Ok. No uso VB pero tomaré la idea en lo que me pueda ayudar. Muchas
gracias.



"Eduardo Alvarado Meza"
escribió en el mensaje
news:
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
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida