Bloqueos y transacciones

29/11/2005 - 20:33 por Pablodegerli | Informe spam
Hola gente
Quiero confirmar algo de los books y de algunos post del foro
Tengo ciertas tablas de uso muy corriente. Pongo los campos mas importantes
para esta consulta
Pallet
Id_Pallet, Id_Producto, Id_Estado_Pallet, Bultos_x_Pallet, etc
Ubicacion
Id_Ubicacion, Nave, Calle, Nivel, etc
UbicacionXPallet
Id_Ubicacion_x_Pallet
Id_Pallet
Id_Ubicacion

En las recepciones se crean pallets, tantos como unidades de cada producto
ingresen, en en la tabla Pallet y se los ubica en Ubicacion_x_Pallet. Las
ubicaciones estan creadas de antemano.
En las expediciones se buscan pallets en Ubicacion_x_Pallet cuyo
Estado_Pallet lo permita, y se van descontando Bultos_x_Pallet de cada
Pallet hasta alcanzar la cantidad a expedir por producto, modificando la
cantidad de Bultos_x_Pallet (si se toma todo el pallet este se da de baja
logica con Bultos_x_Pallet = 0).
En las reubicaciones de pallet se modifica la Ubicacion_x_Pallet
Como esto se realiza a traves de Ordenes de Recepcion o Expedicion o
Reubicacion y estas cuentan de varios items, esto se realiza dentro de
transacciones. Se abre una transaccion, se procesan todos los items y se
cierra si esta ok,

El problema es que existen muchas consultas sobre estas tablas para
determinar el stock, las ubicaciones y demas.
Ahora al eje del problema, segun he leido en cada transaccion que hago por
defecto estoy bloqueando cada una de estas tablas que uso en los insert y
update y las consultas deben esperar a que terminen las transacciones para
retornar los datos.
Como deberia hacer para que esto no suceda a nivel de toda la tabla y si de
los registros que estan en juego.
Es decir, si estoy ingresando Pallets del Id_Producto = 1 que al querer
expedir desde otra terminal seleccione los pallets existentes pero no
aquellos que estoy ingresando.
Vi algo de WITH (ROWLOCK) con lo cual bloqueo solo ese registro.
Tendria que tener en cuenta esto en todos los procesos dentro de
transacciones que trabajen con estas tablas entonces?

Espero sus comentarios

Como siempre, gracias de antemano
 

Leer las respuestas

#1 Miguel Egea
30/11/2005 - 00:27 | Informe spam
Los bloqueos no se escalan directametne a nivel de tabla a menos que tu lo
especifiques así. Digamos que dependiendo de la cantidad de memoria
disponbile, del número de filas afectadas por tu transacción y del nivel de
aislamiento que tengas en tu BBDD (por defecto suele ser REad committed) SQL
escalará el bloqueo, primero a nivel de página y si aún así no puede con el
número de bloqueos entonces a nivel de tabla. VAmos que tu suposicíon no
tiene por que ser así.

Te paso un link de buenas practicas para evitar muchos bloqueos,es bastante
generalista, pero puede darte ideas.

http://www.sql-server-performance.c...ention.asp

y te paso como cazar a procesos bloqueadores

http://www.configuracionesintegrale...articulo%6


Miguel Egea
Visita mi web http://www.portalsql.com
SQL Server MVP, Mentor
Solid Quality Learning
http://www.SolidQualityLearning.com
"Solid Quality Learning is the trusted global provider of advanced education
and solutions for the entire Microsoft database platform"
Espero que te sirva
i



"Pablodegerli" wrote in message
news:
Hola gente
Quiero confirmar algo de los books y de algunos post del foro
Tengo ciertas tablas de uso muy corriente. Pongo los campos mas
importantes
para esta consulta
Pallet
Id_Pallet, Id_Producto, Id_Estado_Pallet, Bultos_x_Pallet, etc
Ubicacion
Id_Ubicacion, Nave, Calle, Nivel, etc
UbicacionXPallet
Id_Ubicacion_x_Pallet
Id_Pallet
Id_Ubicacion

En las recepciones se crean pallets, tantos como unidades de cada producto
ingresen, en en la tabla Pallet y se los ubica en Ubicacion_x_Pallet. Las
ubicaciones estan creadas de antemano.
En las expediciones se buscan pallets en Ubicacion_x_Pallet cuyo
Estado_Pallet lo permita, y se van descontando Bultos_x_Pallet de cada
Pallet hasta alcanzar la cantidad a expedir por producto, modificando la
cantidad de Bultos_x_Pallet (si se toma todo el pallet este se da de baja
logica con Bultos_x_Pallet = 0).
En las reubicaciones de pallet se modifica la Ubicacion_x_Pallet
Como esto se realiza a traves de Ordenes de Recepcion o Expedicion o
Reubicacion y estas cuentan de varios items, esto se realiza dentro de
transacciones. Se abre una transaccion, se procesan todos los items y se
cierra si esta ok,

El problema es que existen muchas consultas sobre estas tablas para
determinar el stock, las ubicaciones y demas.
Ahora al eje del problema, segun he leido en cada transaccion que hago por
defecto estoy bloqueando cada una de estas tablas que uso en los insert y
update y las consultas deben esperar a que terminen las transacciones para
retornar los datos.
Como deberia hacer para que esto no suceda a nivel de toda la tabla y si
de
los registros que estan en juego.
Es decir, si estoy ingresando Pallets del Id_Producto = 1 que al querer
expedir desde otra terminal seleccione los pallets existentes pero no
aquellos que estoy ingresando.
Vi algo de WITH (ROWLOCK) con lo cual bloqueo solo ese registro.
Tendria que tener en cuenta esto en todos los procesos dentro de
transacciones que trabajen con estas tablas entonces?

Espero sus comentarios

Como siempre, gracias de antemano






Preguntas similares