Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Bloquear registros SQL

529 views
Skip to first unread message

hector

unread,
Nov 1, 2009, 6:21:19 AM11/1/09
to
Hola grupo, he intentado bloquear un registro en SQL Server, la idea es que
otro usuario no pueda modificar un registrp hasta que termine la
transacci�n.
Utilizo este codigo, pero no funciona, gracias por su ayuda.

mserial=1231
mgrab= SQLEXEC(gnConnHandle, "BEGIN TRANSACTION aa")
msg=SQLEXEC(gnConnHandle, "select * from tabla1 with( ROWLOCK) where
id_docum=?mserial","ctem")
IF msg<0
msq= AERROR(aErrorArray)
= MESSAGEBOX(aErrorArray(2), 16, 'Error de Bloqueo')
RETURN .f.
ENDIF
*Instrucciones diversas, inclusoabro una ventana para modificar el registro.
mgrab= SQLEXEC(gnConnHandle, "COMMIT TRANSACTION aa")


David Alarcon

unread,
Nov 2, 2009, 11:18:19 AM11/2/09
to

Hola Hector
Algun vez estuve probando esto y me funcion, espero te sirva...

****************************************************************************************

**Para emular el equivalente de:

Seek key

If .not. rlock()

(mensaje de "registro siendo editado en otra terminal")

return

else

(instrucciones de proceso.....)

unlock

endif

***en SQL Server 7.0

set lock_timeout 1000 (esperar 1000 milisegundos) (-1= forever)

BEGIN TRANSACTION

SELECT * FROM TuTabla WITH (ROWLOCK,UPDLOCK) WHERE ctrl=1

(checar si no se recibio mensaje de error del servidor)

IF mensaje de error THEN

(enviar mensaje de error al usuario)

ELSE

(instrucciones de proceso)

ENDIF

COMMIT

NOTAS:

a.. La tabla debe tener declarada una llave principal, de otra forma
ROWLOCK no me funciono.
b.. ROWLOCK indica que se debe bloquear solo un registro de la tabla.
c.. UPDLOCK indica que el bloqueo es como si fuera un update, lo que
permite que el registro sea leido por cualquiera, pero nadie mas puede
bloquearlo ni modificarlo.
d.. ROWLOCK solo funciona de SQL Server 7.0 en adelante
e.. Para leer el registro sin intenci�n de modificarlo... hacer un Select
* from TuTabla where ctrl=1 (sin WITH (ROWLOCK,UPDLOCK))
f.. Aun no he checado si en un SELECT con WHERE condicion (sin incluir la
llave primaria en la condicion) funciona el bloqueo a nivel registro.
g.. SET LOCK_TIMEOUT indica cuanto debe esperar el servido para bloquear
al registro antes de enviar un error. Es el equivalente de SET REPROCES
h.. Para ver el tiempo de espera declarado existe en SQL Server la
variable @@Lock_timeout.
i.. Server: Msg 1222, Level 16, State 50, Line 3

Lock request time out period exceeded.


El error que devuelve SQL Server 7 (siempre y cuando SET Lock_TimeOut sea
diferente de -1) cuando un registro ya esta bloqueado por otro proceso y se
intenta bloquear con (rowlock,updlock) es...


Saludos

David

"hector" <hquinon...@hotmail.com> escribi� en el mensaje
news:uL1ixVuW...@TK2MSFTNGP02.phx.gbl...

hquinones

unread,
Nov 2, 2009, 3:37:15 PM11/2/09
to
Gracias, lo pruebo y te comento.

HQD


"David Alarcon" <d_ala...@yahoo.com.mx> escribi� en el mensaje
news:%23LnNbg9...@TK2MSFTNGP04.phx.gbl...

hquinones

unread,
Nov 2, 2009, 4:15:14 PM11/2/09
to
Gracias, funciono de maravilla.
HQD

"hquinones" <hquinon...@hotmail.com> escribi� en el mensaje
news:uasFFx$WKHA...@TK2MSFTNGP02.phx.gbl...

David A.

unread,
Nov 2, 2009, 11:06:25 PM11/2/09
to
No tienes nada que agradecer, para eso estamos en el foro, para aprender
unos de otros.

Saludos
David


"hquinones" <hquinon...@hotmail.com> escribi� en el mensaje

news:u5GxTGAX...@TK2MSFTNGP05.phx.gbl...

mbejarano

unread,
Nov 3, 2009, 11:18:01 AM11/3/09
to

Serian tan amables de poner como quedaria el string para bloquear.
Gracias..

hquinones

unread,
Nov 3, 2009, 11:46:40 AM11/3/09
to
Me quedo asi:
mserial=exped_ei.id_docum &&campo clave
&&esperar 1000 milisegundos el bloqueo
VL_C_SQL = "SET lock_timeout 1000"
mser= SQLEXEC(gnConnHandle, VL_C_SQL)

mgrab= SQLEXEC(gnConnHandle, "BEGIN TRANSACTION aa")
msg=SQLEXEC(gnConnHandle, "select * from exped_ei with(ROWLOCK,UPDLOCK)
where id_docum=?mserial","ctem")
IF msg<0
*Aqui el mensaje que se quiere mostrar, o dejar el mensaje de SQL
msq= AERROR(aErrorArray)
= MESSAGEBOX(aErrorArray(2), 16, 'El registro esta siendo utilizado por
otra persona')
RETURN .f.
ENDIF

mgrab= SQLEXEC(gnConnHandle, "COMMIT TRANSACTION aa")

ROWLOCK indica que se debe bloquear solo un registro de la tabla.


UPDLOCK indica que el bloqueo es como si fuera un update, lo que
permite que el registro sea leido por cualquiera, pero nadie mas puede
bloquearlo ni modificarlo.

HQD

"mbejarano" <mbej...@discussions.microsoft.com> escribi� en el mensaje
news:4854BD1B-3123-4D68...@microsoft.com...

0 new messages