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

Preguntas similare

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






Respuesta Responder a este mensaje
#2 Pablodegerli
30/11/2005 - 13:12 | Informe spam
Gracias Miguel

Estoy haciendo una prueba asi

CREATE TABLE [Test] ( [id_pk] [int] IDENTITY (1, 1) NOT NULL , [txt]
[varchar] (100) COLLATE Modern_Spanish_CI_AS NULL ) ON [PRIMARY]
declare @1 int
set @1 = 1
while @1 < 10000
begin
insert into Test (txt) values(getdate())
set @1 = @1 + 1
end

Primero proceso esto
declare @1 int
set nocount on
set @1 = 50
begin transaction
while @1 < 3000
begin
update Test set txt = getdate() where id_pk = @1
set @1 = @1 + 1
end
print 'Fin'
commit transaction

en otra ventana al instante esto
select * from test where id_pk = 5

y en otra
exec QuienBloqueaYQuehace

EL registro id_pk = 5 lo retorna recien al terminar el primer proceso y no
aparece nada bloqueado
Como en el proceso de update no trabaja con el registro de id_pk = 5
quisiera que esta libre para cualquier select de otro proceso


"Miguel Egea" escribió en el mensaje
news:
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
>
>
>
>
>
>


Respuesta Responder a este mensaje
#3 Miguel Egea
02/12/2005 - 00:06 | Informe spam
haz una prueba así
abre un qa.
ejectua
begin tran
create table t (id int)

abre otro qa

ejecuta select * from t

abre un tercero

ejecuta exec QuienBloqueaYQuehace

verás claro que si te muestra el bloqueo, ahora solo tienes que cazar los
tuyos propios :-)


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"



"Pablodegerli" wrote in message
news:e%23$
Gracias Miguel

Estoy haciendo una prueba asi

CREATE TABLE [Test] ( [id_pk] [int] IDENTITY (1, 1) NOT NULL , [txt]
[varchar] (100) COLLATE Modern_Spanish_CI_AS NULL ) ON [PRIMARY]
declare @1 int
set @1 = 1
while @1 < 10000
begin
insert into Test (txt) values(getdate())
set @1 = @1 + 1
end

Primero proceso esto
declare @1 int
set nocount on
set @1 = 50
begin transaction
while @1 < 3000
begin
update Test set txt = getdate() where id_pk = @1
set @1 = @1 + 1
end
print 'Fin'
commit transaction

en otra ventana al instante esto
select * from test where id_pk = 5

y en otra
exec QuienBloqueaYQuehace

EL registro id_pk = 5 lo retorna recien al terminar el primer proceso y no
aparece nada bloqueado
Como en el proceso de update no trabaja con el registro de id_pk = 5
quisiera que esta libre para cualquier select de otro proceso


"Miguel Egea" escribió en el mensaje
news:
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
>
>
>
>
>
>






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