Bloquear la lectura de un registro. MS-SQL2005 SP2

15/12/2008 - 17:01 por Rafael Cano | Informe spam
Hola a todos:

¿Cómo puedo bloquear dentro de una transacción un registro?
Creía que con esto se podía:

SELECT * FROM MiEsquema.MiTabla
WITH (XLOCK, ROWLOCK) WHERE PK_KEY = Valor;

Pero me bloquea la lectura de la tabla por completo

Quiero que funcione esta instruccion
SELECT * FROM MiEsquema.MiTabla
WHERE PK_KEY != Valor;

Quiero que se quede esperando la select en el caso de que la selección
de datos coja el id bloqueado.
SELECT * FROM MiEsquema.MiTabla

Al ser posible quiero que la solución sea independiente a como esté
configurado el comando SET TRANSACTION ISOLATION LEVEL la base de datos
está en READ COMMITTED.



Salu2 Rafael Cano
rcanop(arroba)yahoo.es
Jaén - España
Villamartín - Cádiz - España

Preguntas similare

Leer las respuestas

#6 Rafael Cano
15/12/2008 - 21:04 | Informe spam
Si es necesario el bloqueo de esta forma, ya que se utiliza para dar
unos números consecutivos. Eso sí se llama únicamente para al finalizar
la transacción por lo que el tiempo de bloqueo es mínimo.

Gracias por tu interés Rubén. Como he dicho antes las pruebas las hacía
malamente y en verdad si se producía el bloqueo que quería.

Rubén Garrigós escribió:
Hola Rafael,

Si lo que quieres es preservar acceso mientras se están haciendo cambios
en un registro esta aproximación puede traerte problemas debido a la
concurrencia pesimista. Lo primero que habría que plantearse es si es
necesario bloquear el registro de esta forma y no se puede optar por una
estrategia optimista. Si aún así prefieres esta aproximación podrías
leer el resto de registros si indicas el hint NOLOCKen la consulta (de
perdidos al rio):

SELECT * FROM MiEsquema.MiTabla WITH (NOLOCK) WHERE PK_KEY != Valor;

En este caso un READPAST no te valdría debido al bloqueo exclusivo que
estás adquiriendo con el XLOCK. ¿El motivo? Imagino que tendrás unas
cuantas filas dentro de la misma página donde está esa fila que adquirio
el bloqueo IX (intent exclusive) a nivel de página. Mientras no se
libere no se podrá adquirir el bloqueo S (shared) que se genera con READ
COMMITTED cuando realizas la consulta. Por ello se te sigue quedando
bloqueado debido a que no puede leer el resto de filas que están en la
misma página que tu fila bloqueada exclusivamente que mantiene el IX a
nivel de página. Bueno, no me lío con este tema, te paso un par de
enlaces donde hay abundante información sobre el funcionamiento de los
bloqueos de clave:
http://msdn.microsoft.com/es-es/library/ms191272(SQL.90).aspx y sobre la
tabla de compatibilidades de bloqueos:
http://msdn.microsoft.com/es-es/library/ms186396(SQL.90).aspx

Yo quizás me plantearía usar UPDLOCK en la consulta que te bloquea el
registro que necesitas y en las consultas que quieres que se bloqueen si
acceden a registros bloqueados y usaría entonces el READPAST en la
consulta que quieres que pueda leer el resto de registros.

Un saludo,

Rubén Garrigós
Solid Quality Mentors

"Rafael Cano" wrote in message
news:
Hola a todos:

¿Cómo puedo bloquear dentro de una transacción un registro?
Creía que con esto se podía:

SELECT * FROM MiEsquema.MiTabla
WITH (XLOCK, ROWLOCK) WHERE PK_KEY = Valor;

Pero me bloquea la lectura de la tabla por completo

Quiero que funcione esta instruccion
SELECT * FROM MiEsquema.MiTabla
WHERE PK_KEY != Valor;

Quiero que se quede esperando la select en el caso de que la selección
de datos coja el id bloqueado.
SELECT * FROM MiEsquema.MiTabla

Al ser posible quiero que la solución sea independiente a como esté
configurado el comando SET TRANSACTION ISOLATION LEVEL la base de
datos está en READ COMMITTED.



Salu2 Rafael Cano
rcanop(arroba)yahoo.es
Jaén - España
Villamartín - Cádiz - España






Salu2 Rafael Cano
rcanop(arroba)yahoo.es
Jaén - España
Villamartín - Cádiz - España
Respuesta Responder a este mensaje
#7 Rafael Cano
15/12/2008 - 21:05 | Informe spam
Gracías por el interés.

Gustavo Larriera (MVP) escribió:
Muestre el CREATE TABLE y los CREATE INDEX que usted tiene.




Salu2 Rafael Cano
rcanop(arroba)yahoo.es
Jaén - España
Villamartín - Cádiz - España
Respuesta Responder a este mensaje
#8 Leonardo Azpurua
16/12/2008 - 16:37 | Informe spam
"Rafael Cano" escribió en el mensaje
news:
Si es necesario el bloqueo de esta forma, ya que se utiliza para dar unos
números consecutivos. Eso sí se llama únicamente para al finalizar
la transacción por lo que el tiempo de bloqueo es mínimo.



Hola, Rafael:

SQL realiza un bloqueo automático cuando el registro se modifica dentro de
una transacción.

La solución "portatil" que encontré fue incrementar el contador y luego
tomar el valor modificado y restarle uno.

Como de cualquier modo vas a modificarlo, da igual que lo imncrementes antes
o despues de leerlo.


Salud!
Respuesta Responder a este mensaje
#9 Rafael Cano
16/12/2008 - 16:45 | Informe spam
Eso que comentas lo he podido hacer en otro proceso, gracias por tu
aportación.

Leonardo Azpurua escribió:
"Rafael Cano" escribió en el mensaje
news:
Si es necesario el bloqueo de esta forma, ya que se utiliza para dar unos
números consecutivos. Eso sí se llama únicamente para al finalizar
la transacción por lo que el tiempo de bloqueo es mínimo.



Hola, Rafael:

SQL realiza un bloqueo automático cuando el registro se modifica dentro de
una transacción.

La solución "portatil" que encontré fue incrementar el contador y luego
tomar el valor modificado y restarle uno.

Como de cualquier modo vas a modificarlo, da igual que lo imncrementes antes
o despues de leerlo.


Salud!





Salu2 Rafael Cano
rcanop(arroba)yahoo.es
Jaén - España
Villamartín - Cádiz - España
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida