Acerca de los esquemas de bloqueos.

15/01/2004 - 16:24 por Eduardo Mora | Informe spam
Saludos a todos,

Estoy trabajando con SQL Server 2000, SP3.

Buscando en muchos lugares, aún no encuentro la forma de establecer el
esquema de bloqueo de una tabla. Es decir me interesa indicarle al manejador
que para una tabla dada, utilice el esquema de bloqueo datarow (solo por
registro), para evitar que el manejador por si mismo elija el esquema de
bloqueo.

Esto surge debido a un proceso de migración, en donde varios procesos
desarrollados en C# intentan en algunos casos realizar operaciones sobre
tablas comunes; en ciertas oportunidades he encontrado que un proceso
determinado ha bloqueado toda la tabla (table_lock), cuando la cantidad de
registros de la tabla que en realidad esta bloqueando es mínimo comparado
con el volumen de datos de la tabla. Obviamente, esto hace que el resto de
los procesos que necesitan de la tabla se queden esperando.

Si tienen alguna sugerencia al respecto, les agradecería comentarlas.

Muchas gracias de antemano.

Eduardo Mora.

Preguntas similare

Leer las respuestas

#1 Isaías
15/01/2004 - 17:19 | Informe spam
Respuesta Responder a este mensaje
#2 Gustavo Larriera [MVP]
15/01/2004 - 17:50 | Informe spam
Revisa los Books Onlie el tema de cómo se usan los HINTS y SET
ISOLATIONLEVEL

Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Eduardo Mora" wrote in message
news:
Saludos a todos,

Estoy trabajando con SQL Server 2000, SP3.

Buscando en muchos lugares, aún no encuentro la forma de establecer el
esquema de bloqueo de una tabla. Es decir me interesa indicarle al


manejador
que para una tabla dada, utilice el esquema de bloqueo datarow (solo por
registro), para evitar que el manejador por si mismo elija el esquema de
bloqueo.

Esto surge debido a un proceso de migración, en donde varios procesos
desarrollados en C# intentan en algunos casos realizar operaciones sobre
tablas comunes; en ciertas oportunidades he encontrado que un proceso
determinado ha bloqueado toda la tabla (table_lock), cuando la cantidad de
registros de la tabla que en realidad esta bloqueando es mínimo comparado
con el volumen de datos de la tabla. Obviamente, esto hace que el resto de
los procesos que necesitan de la tabla se queden esperando.

Si tienen alguna sugerencia al respecto, les agradecería comentarlas.

Muchas gracias de antemano.

Eduardo Mora.



Respuesta Responder a este mensaje
#3 Eduardo Mora
15/01/2004 - 19:50 | Informe spam
Saludos,

He leído sus observaciones, pero las opciones de SET ISOLATION LEVEL no
aplican solo para una conexión?? Además, yo no quiero reducir el nivel de
isolation de las transacciones, lo que quiero es controlar el nivel de
bloqueo que impone el manejador.

Me explico... hay tres niveles de bloqueo... por tabla, página y
registro... por lo que he observado SQL Server decide cuando utilizar uno de
los tres niveles, de manera pues que cuando el manejador decide bloquear la
tabla (no se por cual factor, ni que parámetro utilizar para ello) las demás
conexiones que están pidiendo datos de la tabla (que no necesariamente es el
mismo registro, incluso diferente página de datos), se quedan esperando por
que se libere el bloqueo de tabla.

De manera pues, lo que deseo conocer es como configurar u obligar al
manejador para que utilice un nivel de bloqueo específico... por ejemplo a
nivel de registros.

En otros manejadores (ej. Sybase) se puede indicar lo umbrales en que el
manejador cambia de bloqueo de registro a pagina y de página a tabla... es
decir hay cierto dominio por parte del DBA para controlar este
comportamiento. Algo similar es lo que necesito.

Espero sus comentarios, y nuevamente muchas gracias de antemano.

Eduardo Mora.


"Gustavo Larriera [MVP]" wrote in
message news:
Revisa los Books Onlie el tema de cómo se usan los HINTS y SET
ISOLATIONLEVEL

Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Eduardo Mora" wrote in message
news:
> Saludos a todos,
>
> Estoy trabajando con SQL Server 2000, SP3.
>
> Buscando en muchos lugares, aún no encuentro la forma de establecer


el
> esquema de bloqueo de una tabla. Es decir me interesa indicarle al
manejador
> que para una tabla dada, utilice el esquema de bloqueo datarow (solo por
> registro), para evitar que el manejador por si mismo elija el esquema de
> bloqueo.
>
> Esto surge debido a un proceso de migración, en donde varios


procesos
> desarrollados en C# intentan en algunos casos realizar operaciones sobre
> tablas comunes; en ciertas oportunidades he encontrado que un proceso
> determinado ha bloqueado toda la tabla (table_lock), cuando la cantidad


de
> registros de la tabla que en realidad esta bloqueando es mínimo


comparado
> con el volumen de datos de la tabla. Obviamente, esto hace que el resto


de
> los procesos que necesitan de la tabla se queden esperando.
>
> Si tienen alguna sugerencia al respecto, les agradecería


comentarlas.
>
> Muchas gracias de antemano.
>
> Eduardo Mora.
>
>
>


Respuesta Responder a este mensaje
#4 Eduardo Mora
15/01/2004 - 21:52 | Informe spam
Saludos,

He leído sus observaciones, pero las opciones de SET ISOLATION LEVEL no
aplican solo para una conexión?? Además, yo no quiero reducir el nivel de
isolation de las transacciones, lo que quiero es controlar el nivel de
bloqueo que impone el manejador.

Me explico... hay tres niveles de bloqueo... por tabla, página y
registro... por lo que he observado SQL Server decide cuando utilizar uno de
los tres niveles, de manera pues que cuando el manejador decide bloquear la
tabla (no se por cual factor, ni que parámetro utilizar para ello) las demás
conexiones que están pidiendo datos de la tabla (que no necesariamente es el
mismo registro, incluso diferente página de datos), se quedan esperando por
que se libere el bloqueo de tabla.

De manera pues, lo que deseo conocer es como configurar u obligar al
manejador para que utilice un nivel de bloqueo específico... por ejemplo a
nivel de registros.

En otros manejadores (ej. Sybase) se puede indicar lo umbrales en que el
manejador cambia de bloqueo de registro a pagina y de página a tabla... es
decir hay cierto dominio por parte del DBA para controlar este
comportamiento. Algo similar es lo que necesito.

Espero sus comentarios, y nuevamente muchas gracias de antemano.

Eduardo Mora.


"Gustavo Larriera [MVP]" wrote in
message news:
Revisa los Books Onlie el tema de cómo se usan los HINTS y SET
ISOLATIONLEVEL

Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Eduardo Mora" wrote in message
news:
> Saludos a todos,
>
> Estoy trabajando con SQL Server 2000, SP3.
>
> Buscando en muchos lugares, aún no encuentro la forma de establecer


el
> esquema de bloqueo de una tabla. Es decir me interesa indicarle al
manejador
> que para una tabla dada, utilice el esquema de bloqueo datarow (solo por
> registro), para evitar que el manejador por si mismo elija el esquema de
> bloqueo.
>
> Esto surge debido a un proceso de migración, en donde varios


procesos
> desarrollados en C# intentan en algunos casos realizar operaciones sobre
> tablas comunes; en ciertas oportunidades he encontrado que un proceso
> determinado ha bloqueado toda la tabla (table_lock), cuando la cantidad


de
> registros de la tabla que en realidad esta bloqueando es mínimo


comparado
> con el volumen de datos de la tabla. Obviamente, esto hace que el resto


de
> los procesos que necesitan de la tabla se queden esperando.
>
> Si tienen alguna sugerencia al respecto, les agradecería


comentarlas.
>
> Muchas gracias de antemano.
>
> Eduardo Mora.
>
>
>






"Eduardo Mora" wrote in message
news:
Saludos a todos,

Estoy trabajando con SQL Server 2000, SP3.

Buscando en muchos lugares, aún no encuentro la forma de establecer el
esquema de bloqueo de una tabla. Es decir me interesa indicarle al


manejador
que para una tabla dada, utilice el esquema de bloqueo datarow (solo por
registro), para evitar que el manejador por si mismo elija el esquema de
bloqueo.

Esto surge debido a un proceso de migración, en donde varios procesos
desarrollados en C# intentan en algunos casos realizar operaciones sobre
tablas comunes; en ciertas oportunidades he encontrado que un proceso
determinado ha bloqueado toda la tabla (table_lock), cuando la cantidad de
registros de la tabla que en realidad esta bloqueando es mínimo comparado
con el volumen de datos de la tabla. Obviamente, esto hace que el resto de
los procesos que necesitan de la tabla se queden esperando.

Si tienen alguna sugerencia al respecto, les agradecería comentarlas.

Muchas gracias de antemano.

Eduardo Mora.



Respuesta Responder a este mensaje
#5 Gustavo Larriera [MVP]
16/01/2004 - 01:34 | Informe spam
Pues como te dije antes, eso que deseas hacer se hace usando HINTS con
combinaciones de ISOLATION LEVEL. A continuación te muestro parte de la
información disponible en los Books Online, trata de estudiarlos que alli
tienes todas las repuestas.

EN GENERAL ES UNA PRACTICA POCO RECOMENDADA modificar la forma automática de
escalamiento de locking que usa el SQL Server.

/* extraido de los Books Online */

Sugerencias de bloqueo

Se puede especificar un intervalo de sugerencias de bloqueo en el nivel de
tabla mediante las instrucciones SELECT, INSERT, UPDATE y DELETE para
indicar a Microsoft® SQL ServerT 2000 el tipo de bloqueo que debe utilizar.
Se pueden utilizar las sugerencias de bloqueo de tabla cuando se requiere un
control más ajustado de los tipos de bloqueo adquiridos en un objeto. Estas
sugerencias de bloqueo suplantan el nivel de aislamiento de la transacción
actual durante la sesión.

Nota: El optimizador de consultas de SQL Server toma automáticamente la
determinación correcta. Se recomienda utilizar las sugerencias de bloqueo de
tabla para modificar el comportamiento de bloqueo predeterminado, en los
casos estrictamente necesarios. Impedir un nivel de bloqueo puede ir en
detrimento de la simultaneidad.

Por ejemplo, si se establece el nivel de aislamiento de la transacción en
SERIALIZABLE y se utiliza la sugerencia de bloqueo de nivel de tabla NOLOCK
con la instrucción SELECT, no se aplican los bloqueos de intervalos de
claves usados normalmente para mantener las transacciones serializables.
USE pubs
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
SELECT au_lname FROM authors WITH (NOLOCK)
GO

Los bloqueos generados son:
EXEC sp_lock
GO


Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Eduardo Mora" wrote in message
news:
Saludos,

He leído sus observaciones, pero las opciones de SET ISOLATION LEVEL


no
aplican solo para una conexión?? Además, yo no quiero reducir el nivel de
isolation de las transacciones, lo que quiero es controlar el nivel de
bloqueo que impone el manejador.

Me explico... hay tres niveles de bloqueo... por tabla, página y
registro... por lo que he observado SQL Server decide cuando utilizar uno


de
los tres niveles, de manera pues que cuando el manejador decide bloquear


la
tabla (no se por cual factor, ni que parámetro utilizar para ello) las


demás
conexiones que están pidiendo datos de la tabla (que no necesariamente es


el
mismo registro, incluso diferente página de datos), se quedan esperando


por
que se libere el bloqueo de tabla.

De manera pues, lo que deseo conocer es como configurar u obligar al
manejador para que utilice un nivel de bloqueo específico... por ejemplo a
nivel de registros.

En otros manejadores (ej. Sybase) se puede indicar lo umbrales en que


el
manejador cambia de bloqueo de registro a pagina y de página a tabla... es
decir hay cierto dominio por parte del DBA para controlar este
comportamiento. Algo similar es lo que necesito.

Espero sus comentarios, y nuevamente muchas gracias de antemano.

Eduardo Mora.


"Gustavo Larriera [MVP]" wrote in
message news:
> Revisa los Books Onlie el tema de cómo se usan los HINTS y SET
> ISOLATIONLEVEL
>
> Gustavo Larriera, MSFT MVP-SQL
> Uruguay LatAm
>
> This message is provided "AS IS" with no warranties expressed or


implied,
> and confers no rights.
>
>
> "Eduardo Mora" wrote in message
> news:
> > Saludos a todos,
> >
> > Estoy trabajando con SQL Server 2000, SP3.
> >
> > Buscando en muchos lugares, aún no encuentro la forma de


establecer
el
> > esquema de bloqueo de una tabla. Es decir me interesa indicarle al
> manejador
> > que para una tabla dada, utilice el esquema de bloqueo datarow (solo


por
> > registro), para evitar que el manejador por si mismo elija el esquema


de
> > bloqueo.
> >
> > Esto surge debido a un proceso de migración, en donde varios
procesos
> > desarrollados en C# intentan en algunos casos realizar operaciones


sobre
> > tablas comunes; en ciertas oportunidades he encontrado que un proceso
> > determinado ha bloqueado toda la tabla (table_lock), cuando la


cantidad
de
> > registros de la tabla que en realidad esta bloqueando es mínimo
comparado
> > con el volumen de datos de la tabla. Obviamente, esto hace que el


resto
de
> > los procesos que necesitan de la tabla se queden esperando.
> >
> > Si tienen alguna sugerencia al respecto, les agradecería
comentarlas.
> >
> > Muchas gracias de antemano.
> >
> > Eduardo Mora.
> >
> >
> >
>
>


"Eduardo Mora" wrote in message
news:
> Saludos a todos,
>
> Estoy trabajando con SQL Server 2000, SP3.
>
> Buscando en muchos lugares, aún no encuentro la forma de establecer


el
> esquema de bloqueo de una tabla. Es decir me interesa indicarle al
manejador
> que para una tabla dada, utilice el esquema de bloqueo datarow (solo por
> registro), para evitar que el manejador por si mismo elija el esquema de
> bloqueo.
>
> Esto surge debido a un proceso de migración, en donde varios


procesos
> desarrollados en C# intentan en algunos casos realizar operaciones sobre
> tablas comunes; en ciertas oportunidades he encontrado que un proceso
> determinado ha bloqueado toda la tabla (table_lock), cuando la cantidad


de
> registros de la tabla que en realidad esta bloqueando es mínimo


comparado
> con el volumen de datos de la tabla. Obviamente, esto hace que el resto


de
> los procesos que necesitan de la tabla se queden esperando.
>
> Si tienen alguna sugerencia al respecto, les agradecería


comentarlas.
>
> Muchas gracias de antemano.
>
> Eduardo Mora.
>
>
>


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