Bloquear registro en SQL

01/11/2009 - 12:26 por hector | Informe spam
Hola grupo, tengo la necesidad de bloquear un registro, el bloqueo sera por
un tiempo determinado por el usuario desde que capture el registro, hatsa
que que de aceptar.
Trato de utilizar:
msg=SQLEXEC(gnConnHandle, "select * from mitabla with(HOLDLOCK, ROWLOCK)
where id_docum=?mserial","ctem")
No me funciona, el codigo es Transac_SQL con Fox, gracias por su ayuda.

Preguntas similare

Leer las respuestas

#6 hquinones
03/11/2009 - 13:30 | Informe spam
Hay toda una polemica al respecto, coincido con que es una mala practica,
deberiamos dejar que SQL hague su trabajo. Pero para aquellos que todavia
les interesa bloquear, lo solucione gracias al foro de VFoxPro de este mismo
grupo (trabajo con VFP y SPT):

&&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.


"hquinones" escribió en el mensaje
news:%
Gracias nuevamente, leere con detenimiento y luego comento.

HQD

"Carlos Sacristan" escribió en el mensaje
news:%
Sigo pensando que es muy mala práctica lo que estás intentando hacer.
Existen soluciones alternativas que permiten la concurrencia en la base
de datos, que es uno de los objetivos a conseguir cuando se trabaja con
ellas.

Te recomiendo la lectura de un hilo en este mismo grupo de primeros de
año que trata justamente un problema muy similar al tuyo:
http://groups.google.es/group/micro...7c17726751
En especial, esta respuesta de Jesús López (SQL Ranger)
http://groups.google.es/group/micro...3aa2f65b6,
seguro que te sirve de gran ayuda.


"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"hector" wrote in message
news:
Gracias por tu respuesta, efectivamente se que existe ese riesgo y ya
explique a mi cliente.
Lo que ellos quieren es por ejemplo en un documento cabecera y detalle,
blockear la cabecera cuando se quiera modificar.
El comando que describi se deja ejecutar en dos seciones distintas, la
idea es que el que ingresa segundo no pueda ejecutarlo y enviarle algun
mensaje.
Con las dos seciones activas, cuando intento hacer el UPDATE desde el
que ingreso segundo se queda colgado hasta que el primero salga, para
finalmente tomar el valor del que ingreso segundo y eso es lo que no
quiere el cliente.

HQD


"Carlos Sacristan" escribió en el mensaje
news:
¿Tienes un índice sobre el campo id_docum?

En todo caso, no es buena idea mantener el bloqueo "hasta que el
usuario de aceptar". Imagínate que se va a tomar un café, o se olvida
de darle a aceptar, o bloquea la pantalla porque tiene que ir a hacer
otra cosa...

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"hector" wrote in message
news:
Hola grupo, tengo la necesidad de bloquear un registro, el bloqueo
sera por un tiempo determinado por el usuario desde que capture el
registro, hatsa que que de aceptar.
Trato de utilizar:
msg=SQLEXEC(gnConnHandle, "select * from mitabla with(HOLDLOCK,
ROWLOCK) where id_docum=?mserial","ctem")
No me funciona, el codigo es Transac_SQL con Fox, gracias por su
ayuda.
















Respuesta Responder a este mensaje
#7 Carlos Sacristan
03/11/2009 - 14:05 | Informe spam
Héctor, no te confudas: a todos nos interesa bloquear porque el bloqueo en
sí es beneficioso al ser lo que garantiza la integridad de los datos.

Lo que decimos que es una mala práctica es seguir usando bloqueo pesimista
(que es lo que estás implementando), limitando de ese modo la concurrencia
del sistema cuando se podría obtener lo mismo que quieres tú sin añadir esa
limitación (me remito al hilo que te enlacé en la respuesta anterior).

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"hquinones" wrote in message
news:
Hay toda una polemica al respecto, coincido con que es una mala practica,
deberiamos dejar que SQL hague su trabajo. Pero para aquellos que todavia
les interesa bloquear, lo solucione gracias al foro de VFoxPro de este
mismo grupo (trabajo con VFP y SPT):

&&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.


"hquinones" escribió en el mensaje
news:%
Gracias nuevamente, leere con detenimiento y luego comento.

HQD

"Carlos Sacristan" escribió en el mensaje
news:%
Sigo pensando que es muy mala práctica lo que estás intentando hacer.
Existen soluciones alternativas que permiten la concurrencia en la base
de datos, que es uno de los objetivos a conseguir cuando se trabaja con
ellas.

Te recomiendo la lectura de un hilo en este mismo grupo de primeros de
año que trata justamente un problema muy similar al tuyo:
http://groups.google.es/group/micro...7c17726751
En especial, esta respuesta de Jesús López (SQL Ranger)
http://groups.google.es/group/micro...3aa2f65b6,
seguro que te sirve de gran ayuda.


"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"hector" wrote in message
news:
Gracias por tu respuesta, efectivamente se que existe ese riesgo y ya
explique a mi cliente.
Lo que ellos quieren es por ejemplo en un documento cabecera y detalle,
blockear la cabecera cuando se quiera modificar.
El comando que describi se deja ejecutar en dos seciones distintas, la
idea es que el que ingresa segundo no pueda ejecutarlo y enviarle algun
mensaje.
Con las dos seciones activas, cuando intento hacer el UPDATE desde el
que ingreso segundo se queda colgado hasta que el primero salga, para
finalmente tomar el valor del que ingreso segundo y eso es lo que no
quiere el cliente.

HQD


"Carlos Sacristan" escribió en el mensaje
news:
¿Tienes un índice sobre el campo id_docum?

En todo caso, no es buena idea mantener el bloqueo "hasta que el
usuario de aceptar". Imagínate que se va a tomar un café, o se olvida
de darle a aceptar, o bloquea la pantalla porque tiene que ir a hacer
otra cosa...

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"hector" wrote in message
news:
Hola grupo, tengo la necesidad de bloquear un registro, el bloqueo
sera por un tiempo determinado por el usuario desde que capture el
registro, hatsa que que de aceptar.
Trato de utilizar:
msg=SQLEXEC(gnConnHandle, "select * from mitabla with(HOLDLOCK,
ROWLOCK) where id_docum=?mserial","ctem")
No me funciona, el codigo es Transac_SQL con Fox, gracias por su
ayuda.




















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