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

#6 Gustavo Larriera [MVP]
16/01/2004 - 01:37 | Informe spam
La forma que decide SQL para lockear es la óptima, basada en la cantidad de
locking que necesita hacer y los recursos disponibles que dispone para
hacerlo.

Puedes quedarte tranquilo que no hay nada que tú puedas hacer que sea más
optimo que lo que hace el propio SQL.

He visto muchas aplicaciones que ajustan el comportamiento del locking y
sencillamente logran peores resultados que cuando SQL Server lo hace solito
por sí mismo.

saludos
gux
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.
> >
> >
> >
>
>


Respuesta Responder a este mensaje
#7 Javier Loria
16/01/2004 - 02:14 | Informe spam
Hola Eduardo:
Lo que buscas es un TABLE HINT, no se como se llaman en espanol. Se
hacen mas o menos asi:
==SELECT *
FROM Authors WITH (ROWLOCK)
== Lo que no entiendo es como se produce el problema en C# con ADO.NET?
estas haciendo algo muy especial con los Adaptadores o los comandos?

Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Eduardo Mora escribio:
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.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida