bloqueos

28/09/2006 - 17:25 por Abraham | Informe spam
Hola todos ..

Tengo el siguiente un SP el cual es ejecutado desde una aplicacion hecha en
visual fox8 mediante ADO.
Desde la aplicacion vfp se controla la transaccion. el esquema es algo asi:

loComando = CREATEOBJECT('adodb.command')
loComando.CommandType = 4 &&& procedimiento almacenado
loComando.CommandText = 'spCompras_Recibir_Compra_AM'

IF THIS.conectar() > 0
loComando.ActiveConnection = THIS.oConexion
...
...
...
loComando.Execute()

THIS.oConexion.CommitTrans

en el SP siguiente necesito hacer un bloqueo sobre la tabla kardex antes de
hacer el select sobre esta, para evitar que varios usuarios ejecuten este
select simultaneamente es decir cuando este select se ejecute los
demas usuarios deben espera hasta que se realice el commit.

he leido sobre SET TRANSACTION ISOLATION LEVEL SERIALIZABLE , es esta la
manera correcta de hacerlo?


CREATE PROCEDURE spCompras_Recibir_Compra_AM
@Codigo_Agencia char(3),
@Codigo_Producto char(10),
@Cantidad int,
@Fecha_Movimiento smalldatetime,
@Identificacion_Tercero char(15),
@Codigo_Compra int,
@Numero_Compra char(10)
AS

DECLARE @Recibida int, @Existencia int
SET @Existencia = 0
SET @Recibida = 1003 --Codigo que corresponde al estado de recibida en la
tabla de maestras_sistemas


PUEDA REALIZAR CONSULTAS SOBRE ESTA

SELECT @Existencia = Existencia
FROM Kardex
WHERE Consecutivo_Kardex IN (SELECT MAX(Consecutivo_Kardex) FROM Kardex
WHERE Codigo_Producto = @Codigo_Producto)

UPDATE Compras SET Codigo_Estado = @Recibida WHERE Codigo_Compra =
@Codigo_Compra
UPDATE Productos_servicios SET Cantidad_Existente = Cantidad_Existente +
@Cantidad
WHERE Codigo_Producto_Servicio = @Codigo_Producto

INSERT INTO Kardex (Codigo_Agencia, Codigo_Producto, Cantidad, Existencia,
Fecha_Movimiento_Producto,
Identificacion_Tercero, Descripcion)
VALUES (@Codigo_Agencia, @Codigo_Producto, @Cantidad, @Existencia +
@Cantidad, @Fecha_Movimiento,
@Identificacion_Tercero, 'Compra Nro: ' + rtrim(@Codigo_Agencia) + '-' +
ltrim(replace( @Numero_Compra,'0','')))

RETURN @@ERROR
GO


Gracias
Abraham Uribe

Preguntas similare

Leer las respuestas

#1 Maxi
28/09/2006 - 19:16 | Informe spam
Hola, cuando haces un update automaticamente se generan bloqueos, no veo una
buena idea bloquear toda la tabla


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Abraham" <sistemasacltda.Arroba.hotmail.com> escribió en el mensaje
news:
Hola todos ..

Tengo el siguiente un SP el cual es ejecutado desde una aplicacion hecha
en visual fox8 mediante ADO.
Desde la aplicacion vfp se controla la transaccion. el esquema es algo
asi:

loComando = CREATEOBJECT('adodb.command')
loComando.CommandType = 4 &&& procedimiento almacenado
loComando.CommandText = 'spCompras_Recibir_Compra_AM'

IF THIS.conectar() > 0
loComando.ActiveConnection = THIS.oConexion
...
...
...
loComando.Execute()

THIS.oConexion.CommitTrans

en el SP siguiente necesito hacer un bloqueo sobre la tabla kardex antes
de hacer el select sobre esta, para evitar que varios usuarios ejecuten
este select simultaneamente es decir cuando este select se ejecute
los demas usuarios deben espera hasta que se realice el commit.

he leido sobre SET TRANSACTION ISOLATION LEVEL SERIALIZABLE , es esta la
manera correcta de hacerlo?


CREATE PROCEDURE spCompras_Recibir_Compra_AM
@Codigo_Agencia char(3),
@Codigo_Producto char(10),
@Cantidad int,
@Fecha_Movimiento smalldatetime,
@Identificacion_Tercero char(15),
@Codigo_Compra int,
@Numero_Compra char(10)
AS

DECLARE @Recibida int, @Existencia int
SET @Existencia = 0
SET @Recibida = 1003 --Codigo que corresponde al estado de recibida en la
tabla de maestras_sistemas

existencias

PUEDA REALIZAR CONSULTAS SOBRE ESTA

SELECT @Existencia = Existencia
FROM Kardex
WHERE Consecutivo_Kardex IN (SELECT MAX(Consecutivo_Kardex) FROM Kardex
WHERE Codigo_Producto = @Codigo_Producto)

UPDATE Compras SET Codigo_Estado = @Recibida WHERE Codigo_Compra =
@Codigo_Compra
UPDATE Productos_servicios SET Cantidad_Existente = Cantidad_Existente +
@Cantidad
WHERE Codigo_Producto_Servicio = @Codigo_Producto

INSERT INTO Kardex (Codigo_Agencia, Codigo_Producto, Cantidad, Existencia,
Fecha_Movimiento_Producto,
Identificacion_Tercero, Descripcion)
VALUES (@Codigo_Agencia, @Codigo_Producto, @Cantidad, @Existencia +
@Cantidad, @Fecha_Movimiento,
@Identificacion_Tercero, 'Compra Nro: ' + rtrim(@Codigo_Agencia) + '-' +
ltrim(replace( @Numero_Compra,'0','')))

RETURN @@ERROR
GO


Gracias
Abraham Uribe


Respuesta Responder a este mensaje
#2 Abraham
28/09/2006 - 20:37 | Informe spam
Hola maxi Gracias por contestar. si, no es buena idea bloquear toda la
tabla.

encontre este articulo
http://www.configuracionesintegrale...p?articulo
en el cual da una solocion a lo que neceseito. la pondre en practica.

Abraham Uribe
Medellin -Colombia



"Maxi" escribió en el mensaje
news:
Hola, cuando haces un update automaticamente se generan bloqueos, no veo
una buena idea bloquear toda la tabla


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Abraham" <sistemasacltda.Arroba.hotmail.com> escribió en el mensaje
news:
Hola todos ..

Tengo el siguiente un SP el cual es ejecutado desde una aplicacion hecha
en visual fox8 mediante ADO.
Desde la aplicacion vfp se controla la transaccion. el esquema es algo
asi:

loComando = CREATEOBJECT('adodb.command')
loComando.CommandType = 4 &&& procedimiento almacenado
loComando.CommandText = 'spCompras_Recibir_Compra_AM'

IF THIS.conectar() > 0
loComando.ActiveConnection = THIS.oConexion
...
...
...
loComando.Execute()

THIS.oConexion.CommitTrans

en el SP siguiente necesito hacer un bloqueo sobre la tabla kardex antes
de hacer el select sobre esta, para evitar que varios usuarios ejecuten
este select simultaneamente es decir cuando este select se ejecute
los demas usuarios deben espera hasta que se realice el commit.

he leido sobre SET TRANSACTION ISOLATION LEVEL SERIALIZABLE , es esta la
manera correcta de hacerlo?


CREATE PROCEDURE spCompras_Recibir_Compra_AM
@Codigo_Agencia char(3),
@Codigo_Producto char(10),
@Cantidad int,
@Fecha_Movimiento smalldatetime,
@Identificacion_Tercero char(15),
@Codigo_Compra int,
@Numero_Compra char(10)
AS

DECLARE @Recibida int, @Existencia int
SET @Existencia = 0
SET @Recibida = 1003 --Codigo que corresponde al estado de recibida en la
tabla de maestras_sistemas

existencias

PUEDA REALIZAR CONSULTAS SOBRE ESTA

SELECT @Existencia = Existencia
FROM Kardex
WHERE Consecutivo_Kardex IN (SELECT MAX(Consecutivo_Kardex) FROM Kardex
WHERE Codigo_Producto = @Codigo_Producto)

UPDATE Compras SET Codigo_Estado = @Recibida WHERE Codigo_Compra =
@Codigo_Compra
UPDATE Productos_servicios SET Cantidad_Existente = Cantidad_Existente +
@Cantidad
WHERE Codigo_Producto_Servicio = @Codigo_Producto

INSERT INTO Kardex (Codigo_Agencia, Codigo_Producto, Cantidad,
Existencia, Fecha_Movimiento_Producto,
Identificacion_Tercero, Descripcion)
VALUES (@Codigo_Agencia, @Codigo_Producto, @Cantidad, @Existencia +
@Cantidad, @Fecha_Movimiento,
@Identificacion_Tercero, 'Compra Nro: ' + rtrim(@Codigo_Agencia) + '-'
+ ltrim(replace( @Numero_Compra,'0','')))

RETURN @@ERROR
GO


Gracias
Abraham Uribe






Respuesta Responder a este mensaje
#3 Miguel Egea
02/10/2006 - 14:03 | Informe spam
Hace tanto tiempo que escribí eso que ni me acordaba :p. Busca por bloqueos
de aplicación también te valdrían para hacer tu zona crítica, pero ten en
cuenta algo muy importante la zona crítica marcará tu máximo nivel de
concurrencia, impidiendo que puedas atender más que ese número de
peticiones, por ejemplo (y exagerando) si se tarda 1 minuto en hacer cada
pedido no podrías hacer más de 60 pedidos por hora en el mejor de los casos,
y entre tanto, el que llegue se queda esperando obteniendo la sensación de
que todo se ha quedado lento.

Si no lo haces así ¿como puedes hacerlo? puedes intentar usar identities,
puedes montar una tabla de contadores pero haciendo que el hecho de hacer el
update no te bloquee y te meta en zona crítica,.. en fin.. hay alternativas.

En resumen, si los condicionantes que te comentaba arriba no aplican, usa
eso que escribí si pueden ser un problema, avisanos y te damos una solución
alternativa.

Saludos
Miguel Egea


"Abraham" <sistemasacltda.Arroba.hotmail.com> wrote in message
news:
Hola maxi Gracias por contestar. si, no es buena idea bloquear toda la
tabla.

encontre este articulo
http://www.configuracionesintegrale...p?articulo
en el cual da una solocion a lo que neceseito. la pondre en practica.

Abraham Uribe
Medellin -Colombia



"Maxi" escribió en el mensaje
news:
Hola, cuando haces un update automaticamente se generan bloqueos, no veo
una buena idea bloquear toda la tabla


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Abraham" <sistemasacltda.Arroba.hotmail.com> escribió en el mensaje
news:
Hola todos ..

Tengo el siguiente un SP el cual es ejecutado desde una aplicacion hecha
en visual fox8 mediante ADO.
Desde la aplicacion vfp se controla la transaccion. el esquema es algo
asi:

loComando = CREATEOBJECT('adodb.command')
loComando.CommandType = 4 &&& procedimiento almacenado
loComando.CommandText = 'spCompras_Recibir_Compra_AM'

IF THIS.conectar() > 0
loComando.ActiveConnection = THIS.oConexion
...
...
...
loComando.Execute()

THIS.oConexion.CommitTrans

en el SP siguiente necesito hacer un bloqueo sobre la tabla kardex
antes de hacer el select sobre esta, para evitar que varios usuarios
ejecuten este select simultaneamente es decir cuando este select
se ejecute los demas usuarios deben espera hasta que se realice el
commit.

he leido sobre SET TRANSACTION ISOLATION LEVEL SERIALIZABLE , es esta
la manera correcta de hacerlo?


CREATE PROCEDURE spCompras_Recibir_Compra_AM
@Codigo_Agencia char(3),
@Codigo_Producto char(10),
@Cantidad int,
@Fecha_Movimiento smalldatetime,
@Identificacion_Tercero char(15),
@Codigo_Compra int,
@Numero_Compra char(10)
AS

DECLARE @Recibida int, @Existencia int
SET @Existencia = 0
SET @Recibida = 1003 --Codigo que corresponde al estado de recibida en
la tabla de maestras_sistemas

existencias

PUEDA REALIZAR CONSULTAS SOBRE ESTA

SELECT @Existencia = Existencia
FROM Kardex
WHERE Consecutivo_Kardex IN (SELECT MAX(Consecutivo_Kardex) FROM Kardex
WHERE Codigo_Producto = @Codigo_Producto)

UPDATE Compras SET Codigo_Estado = @Recibida WHERE Codigo_Compra =
@Codigo_Compra
UPDATE Productos_servicios SET Cantidad_Existente = Cantidad_Existente +
@Cantidad
WHERE Codigo_Producto_Servicio = @Codigo_Producto

INSERT INTO Kardex (Codigo_Agencia, Codigo_Producto, Cantidad,
Existencia, Fecha_Movimiento_Producto,
Identificacion_Tercero, Descripcion)
VALUES (@Codigo_Agencia, @Codigo_Producto, @Cantidad, @Existencia +
@Cantidad, @Fecha_Movimiento,
@Identificacion_Tercero, 'Compra Nro: ' + rtrim(@Codigo_Agencia) + '-'
+ ltrim(replace( @Numero_Compra,'0','')))

RETURN @@ERROR
GO


Gracias
Abraham Uribe










Respuesta Responder a este mensaje
#4 Abraham
02/10/2006 - 18:24 | Informe spam
Hola Miguel,

Gracias por contestar, para el caso en el que aplique lo que comentaste en
el articulo, no hay un alto nivel de concurrencia por lo tanto considero que
esa solución se ajusta a mis necesidades.

Pero me gustaría conocer que otras alternativas existen, ya que si hay otra
manera que me permita mas flexibilidad seria mejor.


Gracias Nuevamente.


Abraham Uribe R.
Medellín-Colombia



"Miguel Egea" escribió en el mensaje
news:
Hace tanto tiempo que escribí eso que ni me acordaba :p. Busca por
bloqueos de aplicación también te valdrían para hacer tu zona crítica,
pero ten en cuenta algo muy importante la zona crítica marcará tu máximo
nivel de concurrencia, impidiendo que puedas atender más que ese número de
peticiones, por ejemplo (y exagerando) si se tarda 1 minuto en hacer cada
pedido no podrías hacer más de 60 pedidos por hora en el mejor de los
casos, y entre tanto, el que llegue se queda esperando obteniendo la
sensación de que todo se ha quedado lento.

Si no lo haces así ¿como puedes hacerlo? puedes intentar usar identities,
puedes montar una tabla de contadores pero haciendo que el hecho de hacer
el update no te bloquee y te meta en zona crítica,.. en fin.. hay
alternativas.

En resumen, si los condicionantes que te comentaba arriba no aplican, usa
eso que escribí si pueden ser un problema, avisanos y te damos una
solución alternativa.

Saludos
Miguel Egea


"Abraham" <sistemasacltda.Arroba.hotmail.com> wrote in message
news:
Hola maxi Gracias por contestar. si, no es buena idea bloquear toda la
tabla.

encontre este articulo
http://www.configuracionesintegrale...p?articulo
en el cual da una solocion a lo que neceseito. la pondre en practica.

Abraham Uribe
Medellin -Colombia



"Maxi" escribió en el mensaje
news:
Hola, cuando haces un update automaticamente se generan bloqueos, no veo
una buena idea bloquear toda la tabla


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Abraham" <sistemasacltda.Arroba.hotmail.com> escribió en el mensaje
news:
Hola todos ..

Tengo el siguiente un SP el cual es ejecutado desde una aplicacion
hecha en visual fox8 mediante ADO.
Desde la aplicacion vfp se controla la transaccion. el esquema es algo
asi:

loComando = CREATEOBJECT('adodb.command')
loComando.CommandType = 4 &&& procedimiento almacenado
loComando.CommandText = 'spCompras_Recibir_Compra_AM'

IF THIS.conectar() > 0
loComando.ActiveConnection = THIS.oConexion
...
...
...
loComando.Execute()

THIS.oConexion.CommitTrans

en el SP siguiente necesito hacer un bloqueo sobre la tabla kardex
antes de hacer el select sobre esta, para evitar que varios usuarios
ejecuten este select simultaneamente es decir cuando este select
se ejecute los demas usuarios deben espera hasta que se realice el
commit.

he leido sobre SET TRANSACTION ISOLATION LEVEL SERIALIZABLE , es esta
la manera correcta de hacerlo?


CREATE PROCEDURE spCompras_Recibir_Compra_AM
@Codigo_Agencia char(3),
@Codigo_Producto char(10),
@Cantidad int,
@Fecha_Movimiento smalldatetime,
@Identificacion_Tercero char(15),
@Codigo_Compra int,
@Numero_Compra char(10)
AS

DECLARE @Recibida int, @Existencia int
SET @Existencia = 0
SET @Recibida = 1003 --Codigo que corresponde al estado de recibida en
la tabla de maestras_sistemas

existencias

PROCESO PUEDA REALIZAR CONSULTAS SOBRE ESTA

SELECT @Existencia = Existencia
FROM Kardex
WHERE Consecutivo_Kardex IN (SELECT MAX(Consecutivo_Kardex) FROM Kardex
WHERE Codigo_Producto = @Codigo_Producto)

UPDATE Compras SET Codigo_Estado = @Recibida WHERE Codigo_Compra =
@Codigo_Compra
UPDATE Productos_servicios SET Cantidad_Existente = Cantidad_Existente
+ @Cantidad
WHERE Codigo_Producto_Servicio = @Codigo_Producto

INSERT INTO Kardex (Codigo_Agencia, Codigo_Producto, Cantidad,
Existencia, Fecha_Movimiento_Producto,
Identificacion_Tercero, Descripcion)
VALUES (@Codigo_Agencia, @Codigo_Producto, @Cantidad, @Existencia +
@Cantidad, @Fecha_Movimiento,
@Identificacion_Tercero, 'Compra Nro: ' + rtrim(@Codigo_Agencia) +
'-' + ltrim(replace( @Numero_Compra,'0','')))

RETURN @@ERROR
GO


Gracias
Abraham Uribe














Respuesta Responder a este mensaje
#5 Miguel Egea
02/10/2006 - 22:21 | Informe spam
Intentaré publicar algo en portalsql esta semana (lo cierto es que ando
hasta arriba y no se si será posible) que vaya en aras de mejorar la
concurrencia.

Saludos

"Abraham" <sistemasacltda.Arroba.hotmail.com> wrote in message
news:%23N1%
Hola Miguel,

Gracias por contestar, para el caso en el que aplique lo que comentaste
en el articulo, no hay un alto nivel de concurrencia por lo tanto
considero que esa solución se ajusta a mis necesidades.

Pero me gustaría conocer que otras alternativas existen, ya que si hay
otra manera que me permita mas flexibilidad seria mejor.


Gracias Nuevamente.


Abraham Uribe R.
Medellín-Colombia



"Miguel Egea" escribió en el mensaje
news:
Hace tanto tiempo que escribí eso que ni me acordaba :p. Busca por
bloqueos de aplicación también te valdrían para hacer tu zona crítica,
pero ten en cuenta algo muy importante la zona crítica marcará tu máximo
nivel de concurrencia, impidiendo que puedas atender más que ese número
de peticiones, por ejemplo (y exagerando) si se tarda 1 minuto en hacer
cada pedido no podrías hacer más de 60 pedidos por hora en el mejor de
los casos, y entre tanto, el que llegue se queda esperando obteniendo la
sensación de que todo se ha quedado lento.

Si no lo haces así ¿como puedes hacerlo? puedes intentar usar identities,
puedes montar una tabla de contadores pero haciendo que el hecho de hacer
el update no te bloquee y te meta en zona crítica,.. en fin.. hay
alternativas.

En resumen, si los condicionantes que te comentaba arriba no aplican, usa
eso que escribí si pueden ser un problema, avisanos y te damos una
solución alternativa.

Saludos
Miguel Egea


"Abraham" <sistemasacltda.Arroba.hotmail.com> wrote in message
news:
Hola maxi Gracias por contestar. si, no es buena idea bloquear toda la
tabla.

encontre este articulo
http://www.configuracionesintegrale...p?articulo
en el cual da una solocion a lo que neceseito. la pondre en practica.

Abraham Uribe
Medellin -Colombia



"Maxi" escribió en el mensaje
news:
Hola, cuando haces un update automaticamente se generan bloqueos, no
veo una buena idea bloquear toda la tabla


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"Abraham" <sistemasacltda.Arroba.hotmail.com> escribió en el mensaje
news:
Hola todos ..

Tengo el siguiente un SP el cual es ejecutado desde una aplicacion
hecha en visual fox8 mediante ADO.
Desde la aplicacion vfp se controla la transaccion. el esquema es algo
asi:

loComando = CREATEOBJECT('adodb.command')
loComando.CommandType = 4 &&& procedimiento almacenado
loComando.CommandText = 'spCompras_Recibir_Compra_AM'

IF THIS.conectar() > 0
loComando.ActiveConnection = THIS.oConexion
...
...
...
loComando.Execute()

THIS.oConexion.CommitTrans

en el SP siguiente necesito hacer un bloqueo sobre la tabla kardex
antes de hacer el select sobre esta, para evitar que varios usuarios
ejecuten este select simultaneamente es decir cuando este select
se ejecute los demas usuarios deben espera hasta que se realice el
commit.

he leido sobre SET TRANSACTION ISOLATION LEVEL SERIALIZABLE , es esta
la manera correcta de hacerlo?


CREATE PROCEDURE spCompras_Recibir_Compra_AM
@Codigo_Agencia char(3),
@Codigo_Producto char(10),
@Cantidad int,
@Fecha_Movimiento smalldatetime,
@Identificacion_Tercero char(15),
@Codigo_Compra int,
@Numero_Compra char(10)
AS

DECLARE @Recibida int, @Existencia int
SET @Existencia = 0
SET @Recibida = 1003 --Codigo que corresponde al estado de recibida en
la tabla de maestras_sistemas

existencias

PROCESO PUEDA REALIZAR CONSULTAS SOBRE ESTA

SELECT @Existencia = Existencia
FROM Kardex
WHERE Consecutivo_Kardex IN (SELECT MAX(Consecutivo_Kardex) FROM
Kardex WHERE Codigo_Producto = @Codigo_Producto)

UPDATE Compras SET Codigo_Estado = @Recibida WHERE Codigo_Compra =
@Codigo_Compra
UPDATE Productos_servicios SET Cantidad_Existente = Cantidad_Existente
+ @Cantidad
WHERE Codigo_Producto_Servicio = @Codigo_Producto

INSERT INTO Kardex (Codigo_Agencia, Codigo_Producto, Cantidad,
Existencia, Fecha_Movimiento_Producto,
Identificacion_Tercero, Descripcion)
VALUES (@Codigo_Agencia, @Codigo_Producto, @Cantidad, @Existencia +
@Cantidad, @Fecha_Movimiento,
@Identificacion_Tercero, 'Compra Nro: ' + rtrim(@Codigo_Agencia) +
'-' + ltrim(replace( @Numero_Compra,'0','')))

RETURN @@ERROR
GO


Gracias
Abraham Uribe


















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