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.

Preguntas similare

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.
Respuesta Responder a este mensaje
#2 Anonimo
04/10/2004 - 09:59 | Informe spam
Hola,

Evidentemente no son las tablas originales

Esto está hecho como prueba, sobre una tabla con 1 solo
campo (que es indice) y sólo contiene dos registros. La
prueba de bloqueos la hago con el query analyzer. No se
está ejecutando ninguna otra consulta en la BD.

Sí modifico los registros 200 veces por minuto... y tendre
que hacerlo más veces. Pero no es la clave primaria lo que
se modifica, esto es solo una prueba que hice para
comprobar si funcionaba el bloqueo a nivel de registro y
al parecer el 'rowlock' bloquea o la tabla completa o por
paginas.

Crea una tabla, añadele dos registros y ejecuta las
sentencias sql que expuse.

¿Alguna sugerencia?.

Un saludo y gracias.

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.


.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida