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")
****************************************************************************************
**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...
HQD
"David Alarcon" <d_ala...@yahoo.com.mx> escribi� en el mensaje
news:%23LnNbg9...@TK2MSFTNGP04.phx.gbl...
"hquinones" <hquinon...@hotmail.com> escribi� en el mensaje
news:uasFFx$WKHA...@TK2MSFTNGP02.phx.gbl...
Saludos
David
"hquinones" <hquinon...@hotmail.com> escribi� en el mensaje
news:u5GxTGAX...@TK2MSFTNGP05.phx.gbl...
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...