SQL Server - Bloqueos que pasan a nivel de tabla

 
Vista:

Bloqueos que pasan a nivel de tabla

Publicado por Moisés (2 intervenciones) el 24/04/2007 20:59:20
Hola

Tengo una aplicación visual .NET instalada en una empresa cliente que ha estado funcionando un par de años sin problemas pero ahora, aparentemente sin razón alguna, ha comenzado a dar problema de bloqueos.
El problema consiste en que antes se efectuaba un bloqueo a nivel de registro para evitar una posible modificación concurrente y ahora dicho bloqueo afecta a toda la tabla, evitando la posibilidad de hacer modificaciones concurrentes de dos registros cualquiera de la misma tabla

El bloqueo se conseguía por medio de la siguiente sentencia (c_expediente es la clave de la tabla):
update RRHH_EXPE_PRES
set d_observaciones = d_observaciones
where c_expediente = EXPEDIENTE

Pensaba probar a incluir la opción "with (RowLock)" en el update, pero, si antes funcionaba sin esa cláusula, no entiendo porqué ahora no... Los de la empresa cliente dicen que no han tocado nada en el servidor, tan sólo hablan de unos cambios en la configuración de la red (?!?!?)
El error aparece desde el primer momento, así que tampoco creo que sea cosa del escalado del bloqueo desde nivel de registro a nivel de tabla...

Es un SQLServer 2000. El nivel de ISOLATION se fija como:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Si alguien decirme qué puede estar pasando o cómo paliarlo...

Gracias de todos modos
Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Bloqueos que pasan a nivel de tabla

Publicado por Isaías (3308 intervenciones) el 24/04/2007 21:58:41
EXPEDIENTE, ¿Es una columnas de la misma tabla RRHH_EXPE_PRES?, ¿Ya verificaste al momento del bloqueo en tu analizador de consultas DBCC OPENTRAN y ver que esta haciendo la transaccion en cuestion con DBCC INPUTBUFFER (tu_spid)?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bloqueos que pasan a nivel de tabla

Publicado por Moisés (2 intervenciones) el 24/04/2007 23:56:25
Hola Isaías

No, realmente el código fuente es algo así:
comand.CommandText =
"update RRHH_EXPE_PRES " + _
" set d_observaciones = d_observaciones " + _
" where c_expediente = " + EXPEDIENTE )
comand.ExecuteNonQuery()
Lo puse de la otra forma por simplificar

No he tenido acceso aún al servidor del cliente porque tampoco sabría qué mirar...
Acabo de ejecutar los comandos que me indicas en mi instalación local y me devuelven algo así:

DBCC opentran;

DBCC INPUTBUFFER (1);

Información de transacción para la base de datos 'RRHH'.

Transacción activa más antigua:
SPID (Id. de proceso de servidor) : 55
UID (Id. de usuario) : 1
Nombre : user_transaction
LSN : (36:348:1)
Hora de inicio : Abr 25 2007 12:05:26:313AM
Ejecución de DBCC completada. Si hay mensajes de error, consulte al administrador del sistema.

El SPID especificado no procesa flujos de datos de entrada o salida.
Ejecución de DBCC completada. Si hay mensajes de error, consulte al administrador del sistema.

Con DBCC opentran sí que veo la transacción abierta, aunque no parece que me dé información del bloqueo. La segunda orden, DBCC INPUTBUFFER (1), no parece que me dé ninguna información relevante...

Por otra parte, ¿Crees que merece la pena hacer que prueben con la opción WITH (ROWLOCK)?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bloqueos que pasan a nivel de tabla

Publicado por Isaías (3308 intervenciones) el 25/04/2007 18:18:12
La primera instruccion: DBCC OPENTRAN

Te muestra la transaccion mas antigua (segun tu, la numero 1)

La segunda opcion: DBCC INPUTBUFFER(1)

Debe darte el COMANDO que esa transaccion esta ejecutando.

¿Esa asi?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar