Bloqueos en transacciones

20/09/2004 - 17:39 por Alessan | Informe spam
Hola,

Al lanzar una transacción, la tabla se me bloquea
completamenta para modificacion y borrado de registros:

Puedo leer los registros usando NOLOCK en la clausula FROM
de la consulta de seleccion, pero lo que me gustaría es
poder actualizar otros registros (bloqueo a nivel de fila)
mientras la transaccion aun no terminó.

El programa que estoy desarrollando ejecuta estas
transacciones entre 70~200 veces por minuto en hilos
diferentes, pero no puede actualizar un registro hasta que
termina la transaccion anterior. ese es el problema
(la transaccion queda en cola esperando que finalize la
anterior).

Supuestamente con la Clausula WITH (ROWLOCK) deberia
bloquear solo los registros utilizados en la consulta de
actualizacion, pero me bloquea la tabla completa para
escritura.

Es decir si ejecuto:


Código SQL:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
go
begin tran
update AA with (rowlock)
set IDAA = '1'
where IDAA = '29'

y sin finalizar la transaccion ejecuto:

Código SQL:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
go
begin tran
update AA with (rowlock)
set IDAA = '2'
where IDAA = '30'

Siendo IDAA clave primaria, la segunda consulta no se
ejcuta mientras no haga un commit o un rollback de la
primera transaccion.

¿Alguna Sugerencia?

Un Saludo y Gracias.
 

Leer las respuestas

#1 Adrian D. Garcia
20/09/2004 - 23:46 | Informe spam
Son estas las estructuras de las tablas? Es cierto que estas modificando tu
clave primara y esto lo haces entre 70 y 200 veces por minuto?

Podrias enviar la estructura de la tabla, la sentencia UPDATE real y la
definicion de indices de esa tabla?
Con estos datos podriamos ayudarte mejor para determinar el problema.

En cuanto a los locks, ten en cuenta que al modificar la clave primaria SQL
Server debe actualizar los indices, que en este caso son cluster/agrupados.
Es decir, que ademas de realizar la modificacion debe estar modificando no
solo la ubicacion fisica de la fila dentro de la tabla (en un indice cluster
las filas siguen el orden fisico de las tablas) sino que ademas debe estar
reordenando la estructura del indice. Por lo que ese simple UPDATE esta
generando mas lockeos de los que aparentemente realiza. Lo mas probable que
este pasando es que una transaccion esta bloqueando a otra por toda la
reorganizacion que debe realizar en forma interna, mas que generando un
bloqueo a nivel de tabla.

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Alessan" wrote in message
news:3c4001c49f28$001179b0$
Hola,

Al lanzar una transacción, la tabla se me bloquea
completamenta para modificacion y borrado de registros:

Puedo leer los registros usando NOLOCK en la clausula FROM
de la consulta de seleccion, pero lo que me gustaría es
poder actualizar otros registros (bloqueo a nivel de fila)
mientras la transaccion aun no terminó.

El programa que estoy desarrollando ejecuta estas
transacciones entre 70~200 veces por minuto en hilos
diferentes, pero no puede actualizar un registro hasta que
termina la transaccion anterior. ese es el problema
(la transaccion queda en cola esperando que finalize la
anterior).

Supuestamente con la Clausula WITH (ROWLOCK) deberia
bloquear solo los registros utilizados en la consulta de
actualizacion, pero me bloquea la tabla completa para
escritura.

Es decir si ejecuto:


Código SQL:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
go
begin tran
update AA with (rowlock)
set IDAA = '1'
where IDAA = '29'

y sin finalizar la transaccion ejecuto:

Código SQL:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
go
begin tran
update AA with (rowlock)
set IDAA = '2'
where IDAA = '30'

Siendo IDAA clave primaria, la segunda consulta no se
ejcuta mientras no haga un commit o un rollback de la
primera transaccion.

¿Alguna Sugerencia?

Un Saludo y Gracias.

Preguntas similares