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
 

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


Preguntas similares