Bloqueo de registros en SQL Server 2008

30/01/2009 - 10:12 por José Antonio Muñoz | Informe spam
Hola al grupo,

Estoy desarrollando una aplicación con SQL Server para gestionar 5 puestos
en red. Estoy intentando analizar como se bloquean filas individuales y
también en grupo. Para bloquear filas individuales estoy utilizando las
sugerencias de consulta WITH (ROWLOCK, HOLDLOCK, UPDLOCK) en la cláusula
FROM de una consulta y parece ser que funciona correctamente, al intentar
abrir un recordset en una transacción bloquea la fila correspondiente a la
consulta y el resto de usuarios no pueden abrir en otra transacción la misma
fila. Sin embargo cuando intento ejecutar una consulta que me devuelve
varias filas me bloquea toda la tabla y no las filas individuales.

¿Como puedo solucionar este problema?

Saludos,
José Antonio Muñoz.

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera (MVP)
30/01/2009 - 15:35 | Informe spam
Seré curioso: Por qué desea usted indicarle a SQL Server lo qué cosas deberá
lockear, en vez de permitirle que lo haga en forma automática acorde al
SERIALIZATION LEVEL que se haya establecido?

Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"José Antonio Muñoz" wrote:

Hola al grupo,

Estoy desarrollando una aplicación con SQL Server para gestionar 5 puestos
en red. Estoy intentando analizar como se bloquean filas individuales y
también en grupo. Para bloquear filas individuales estoy utilizando las
sugerencias de consulta WITH (ROWLOCK, HOLDLOCK, UPDLOCK) en la cláusula
FROM de una consulta y parece ser que funciona correctamente, al intentar
abrir un recordset en una transacción bloquea la fila correspondiente a la
consulta y el resto de usuarios no pueden abrir en otra transacción la misma
fila. Sin embargo cuando intento ejecutar una consulta que me devuelve
varias filas me bloquea toda la tabla y no las filas individuales.

¿Como puedo solucionar este problema?

Saludos,
José Antonio Muñoz.


Respuesta Responder a este mensaje
#2 José Antonio Muñoz
30/01/2009 - 17:36 | Informe spam
¿Cómo puedo establecer el SERIALIZATION LEVEL para automatizar el bloqueo de
registros y de tablas?

saludos,
José Antonio Muñoz

"Gustavo Larriera (MVP)"
escribió en el mensaje de noticias
news:
Seré curioso: Por qué desea usted indicarle a SQL Server lo qué cosas
deberá
lockear, en vez de permitirle que lo haga en forma automática acorde al
SERIALIZATION LEVEL que se haya establecido?

Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"José Antonio Muñoz" wrote:

Hola al grupo,

Estoy desarrollando una aplicación con SQL Server para gestionar 5
puestos
en red. Estoy intentando analizar como se bloquean filas individuales y
también en grupo. Para bloquear filas individuales estoy utilizando las
sugerencias de consulta WITH (ROWLOCK, HOLDLOCK, UPDLOCK) en la cláusula
FROM de una consulta y parece ser que funciona correctamente, al intentar
abrir un recordset en una transacción bloquea la fila correspondiente a
la
consulta y el resto de usuarios no pueden abrir en otra transacción la
misma
fila. Sin embargo cuando intento ejecutar una consulta que me devuelve
varias filas me bloquea toda la tabla y no las filas individuales.

¿Como puedo solucionar este problema?

Saludos,
José Antonio Muñoz.


Respuesta Responder a este mensaje
#3 Gustavo Larriera (MVP)
30/01/2009 - 17:50 | Informe spam
Espero que estos artículos le sean útiles. El primero es algo viejo pero las
ideas aún sirven. El segundo apunta al BOL donde se explica cómo se usa SET
TRANSACTION ISOLATION para configurar el nivel de aislamiento que desee.

Lo habitual es usar el nivel READ COMMITTED o el nivel REPEATABLE READ. Pero
cuál usar depende de lo que sus transacciones necesiten hacer.

Locking in Microsoft SQL Server
http://www.mssqlcity.com/Articles/A...0Locks.htm


SET TRANSACTION ISOLATION LEVEL (Transact-SQL)
http://msdn.microsoft.com/en-us/lib...73763.aspx

Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"José Antonio Muñoz" wrote:

¿Cómo puedo establecer el SERIALIZATION LEVEL para automatizar el bloqueo de
registros y de tablas?

saludos,
José Antonio Muñoz

"Gustavo Larriera (MVP)"
escribió en el mensaje de noticias
news:
> Seré curioso: Por qué desea usted indicarle a SQL Server lo qué cosas
> deberá
> lockear, en vez de permitirle que lo haga en forma automática acorde al
> SERIALIZATION LEVEL que se haya establecido?
>
> Gustavo Larriera, Microsoft MVP
> http://www.linkedin.com/in/gustavolarriera
> Este mensaje se proporciona tal como es, sin garantías de ninguna clase.
>
>
>
> "José Antonio Muñoz" wrote:
>
>> Hola al grupo,
>>
>> Estoy desarrollando una aplicación con SQL Server para gestionar 5
>> puestos
>> en red. Estoy intentando analizar como se bloquean filas individuales y
>> también en grupo. Para bloquear filas individuales estoy utilizando las
>> sugerencias de consulta WITH (ROWLOCK, HOLDLOCK, UPDLOCK) en la cláusula
>> FROM de una consulta y parece ser que funciona correctamente, al intentar
>> abrir un recordset en una transacción bloquea la fila correspondiente a
>> la
>> consulta y el resto de usuarios no pueden abrir en otra transacción la
>> misma
>> fila. Sin embargo cuando intento ejecutar una consulta que me devuelve
>> varias filas me bloquea toda la tabla y no las filas individuales.
>>
>> ¿Como puedo solucionar este problema?
>>
>> Saludos,
>> José Antonio Muñoz.
>>
>>


Respuesta Responder a este mensaje
#4 José Antonio Muñoz
02/02/2009 - 10:44 | Informe spam
Hola Gustavo,

He mirado los artículos que me has enviado y son interesantes, muchas
gracias por ello, sin embargo no resulve mi problema. Te explico:

Yo tengo una tabla que tiene un campo que se repite según unas determinadas
condiciones. Si un usuario necesita modificar los registros cuyo valor de
ese campo sea 1 (puede haber varios registros) primero hago un SELECT para
ver que registros que son y uno por uno voy modificando con la instrucción
UPDATE. Otro usuario puede modicar otros registros con otro valor de campo y
así sucesivamente con muchos usuarios. Yo necesito bloquear todos los
registros seleccionados por el usuario X para que nadie pueda modificar (ni
siquiera ver con un SELECT) esos registros sin embargo he probado con los
diferentes niveles de aislamiento y los diferentes Hits de bloqueos pero no
me funciona ya que o bloquea todos los registros de la tabla y por tanto los
demas usuarios no pueden hacer su SELECT correspondiente para modificar o no
me bloquea ningún registro y por ello todo el mundo ve los registros incluso
los bloqueados.

NOTA: Solo cuando el campo correspondiente sea clave y no se repita el
bloqueo si funciona correctamente, es decir, que puedo hacer un SELECT cuyo
valor sea 1 y solo me recupera un registro. Otro usuario intenta hacer
SELECT a ese registro y no puede ya que da un error de bloqueo. Pero si hace
un SELECT de otro registro, por ejemplo, el 2 y si puede.

Saludos,
José Antonio Muñoz.

"Gustavo Larriera (MVP)"
escribió en el mensaje de noticias
news:
Espero que estos artículos le sean útiles. El primero es algo viejo pero
las
ideas aún sirven. El segundo apunta al BOL donde se explica cómo se usa
SET
TRANSACTION ISOLATION para configurar el nivel de aislamiento que desee.

Lo habitual es usar el nivel READ COMMITTED o el nivel REPEATABLE READ.
Pero
cuál usar depende de lo que sus transacciones necesiten hacer.

Locking in Microsoft SQL Server
http://www.mssqlcity.com/Articles/A...0Locks.htm


SET TRANSACTION ISOLATION LEVEL (Transact-SQL)
http://msdn.microsoft.com/en-us/lib...73763.aspx

Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"José Antonio Muñoz" wrote:

¿Cómo puedo establecer el SERIALIZATION LEVEL para automatizar el bloqueo
de
registros y de tablas?

saludos,
José Antonio Muñoz

"Gustavo Larriera (MVP)"
escribió en el mensaje de noticias
news:
> Seré curioso: Por qué desea usted indicarle a SQL Server lo qué cosas
> deberá
> lockear, en vez de permitirle que lo haga en forma automática acorde al
> SERIALIZATION LEVEL que se haya establecido?
>
> Gustavo Larriera, Microsoft MVP
> http://www.linkedin.com/in/gustavolarriera
> Este mensaje se proporciona tal como es, sin garantías de ninguna
> clase.
>
>
>
> "José Antonio Muñoz" wrote:
>
>> Hola al grupo,
>>
>> Estoy desarrollando una aplicación con SQL Server para gestionar 5
>> puestos
>> en red. Estoy intentando analizar como se bloquean filas individuales
>> y
>> también en grupo. Para bloquear filas individuales estoy utilizando
>> las
>> sugerencias de consulta WITH (ROWLOCK, HOLDLOCK, UPDLOCK) en la
>> cláusula
>> FROM de una consulta y parece ser que funciona correctamente, al
>> intentar
>> abrir un recordset en una transacción bloquea la fila correspondiente
>> a
>> la
>> consulta y el resto de usuarios no pueden abrir en otra transacción la
>> misma
>> fila. Sin embargo cuando intento ejecutar una consulta que me devuelve
>> varias filas me bloquea toda la tabla y no las filas individuales.
>>
>> ¿Como puedo solucionar este problema?
>>
>> Saludos,
>> José Antonio Muñoz.
>>
>>


Respuesta Responder a este mensaje
#5 Gustavo Larriera (MVP)
02/02/2009 - 13:33 | Informe spam
Hola José Antonio Muñoz,

"José Antonio Muñoz" wrote:

Yo tengo una tabla que tiene un campo que se repite según unas determinadas
condiciones. Si un usuario necesita modificar los registros cuyo valor de
ese campo sea 1 (puede haber varios registros) primero hago un SELECT para
ver que registros que son y uno por uno voy modificando con la instrucción
UPDATE.



Cuando usted dice "uno por uno voy modificando" se refiere a que usa un
cursor? O cómo es que usted hace esa modificación fila por fila?

NOTA: Solo cuando el campo correspondiente sea clave y no se repita el
bloqueo si funciona correctamente, es decir, que puedo hacer un SELECT cuyo
valor sea 1 y solo me recupera un registro. Otro usuario intenta hacer
SELECT a ese registro y no puede ya que da un error de bloqueo. Pero si hace
un SELECT de otro registro, por ejemplo, el 2 y si puede.




Puede usted mostrar la estructura de la tabla y los índices que hay creados
para ella?

Saludos
~gux
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida