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

#16 José Antonio Muñoz
03/02/2009 - 09:07 | Informe spam
Estoy de acuerdo contigo pero llevo la aplicación muy avanzada y tengo unos
plazos que cumplir y no me puedo plantear ahora rediseñar la aplicación.
Para una próxima aplicación tendré en cuenta vuestros consejos y plantearé
el tema de los bloqueos de otra manera.

Gracias y saludos,
José Antonio Muñoz.

"Jose Mariano Alvarez"
escribió en el
mensaje de noticias
news:
Mostrar la cita
#17 Jesús
03/02/2009 - 12:30 | Informe spam
"José Antonio Muñoz" escribió en el mensaje de
noticias news:
Mostrar la cita
No sé si estarás enterado de que a partir de SQL Server 2005 existen dos
nuevos niveles de aislamiento:

* READ COMMITTED SNAPSHOT
* SNAPSHOT

Con estos niveles de aislamiento un usuario podría ver las filas modificadas
y bloqueadas de forma exclusiva por otro usuario que aún no están
confirmadas, sin producirse lecturas sucias. El usuario vería la última
versión confirmada de las filas.

Esto podría ser una solución para permitir ver las filas modificadas sin
incurrir en lecturas sucias. Eso de que "no puedes verlo porque otro usuario
está trabajando con ello" no me gusta demasiado, prefiero darle una vista de
como estaban los datos antes de que empezara a trabajar con ello. Al fin y
al cabo ese "estaban" es en realidad "están", puesto que los cambios aún no
se han confirmado.

Mostrar la cita
¿Te refieres a lo que dijo Carlos o a lo que dije yo?

En cualquier caso lo que es una mala práctica es "que la duración de los
bloqueos de los recursos de SQL Server esté bajo el control de los usuarios"

Por ejemplo esto es mala práctica:

BEGIN TRANSACTION

UPDATE ...

INSERT ...

...
COMMIT

Mostrar la cita
¿Y qué me dices de la detección de los conflictos de concurrencia? Es decir,
detectar si ha habido cambios en las filas e invalidar el proceso en tal
caso.
¿Cuantas veces al año se produce tal cosa?
Si los usuarios tienen bien repartido y asignado el trabajo, eso no debería
producirse nunca o casi nunca, y por tanto esto sería la mejor solución.
Los datasets y dataadapters, LINQ to SQL y Entity Framework ya tienen
incorporado mecanismos de detección de conflictos de concurrencia.
¿Introducir estos mecanismos haría que no cumplieras los plazos de entrega?

Mostrar la cita
#18 Jose Mariano Alvarez
03/02/2009 - 13:43 | Informe spam
Suerte, luego nos cuentas como te fue.



Saludos


Ing. Jose Mariano Alvarez
SQLTotal Consulting

(Cambia los ceros por O y saca lo que sobra)

Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase. Por
favor tratar de indicar la versión de SQL y Service Pack. La inclusión de
(CREATE, INSERTS, etc.) para poder reproducir el problema también ayuda.










"José Antonio Muñoz" wrote in message
news:
Mostrar la cita
Ads by Google
Search Busqueda sugerida