Store Procedure Para Multiusuario

01/08/2008 - 18:46 por SystemBuilder | Informe spam
Hola Amigos:

Tengo un store que hace un insert, no sin antes calcular el ultimo
indice de la tabla, para agregarle el siguiente, pero al usarlo en
otro equipo hace un conflicto, ya que hace duplicado de indice y me
bota el error de restriccion en primary key.

ALTER Procedure [dbo].[usp_Pub_Detalle_Guardar]
@Control numeric = null output,
@Sku varchar(50)
As
Declare @Cont Numeric
Set @Cont = (Select Max(Control) From PublicacionesDetalle)
If @Cont = 0 Or @Cont Is Null
Set @Control = 1
Else
Set @Control = @Cont + 1
Insert Into PublicacionesDetalle
(Control,ConPublic,Sku)
Values
(@Control,0,@Sku)

Puden ayudarme porfa???

Gracias,

SystemBuilder
 

Leer las respuestas

#1 Isaias
01/08/2008 - 19:08 | Informe spam
Debes manejar TRANSACCIONES EXPLICITAS, revisa el siguiente ejemplo:

Es una rutina que genera un FOLIO y lo devuelve a quien ha invocado el store
procedure, se probo con 30 usuarios simultaneos y 2 procesos batch, en ningun
caso, se genero una duplicidad, ni hubo dead-lock.

CREATE TABLE OTRATABLA (FOLIO INT IDENTITY(1,1), NOMBRE CHAR(10))

INSERT INTO OTRATABLA VALUES('JUAN')
INSERT INTO OTRATABLA VALUES('PABLO')
SELECT * FROM OTRATABLA

DROP TABLE FOLIADOR
CREATE TABLE FOLIADOR (FOLIO INT PRIMARY KEY)
INSERT INTO FOLIADOR VALUES(0)
UPDATE FOLIADOR SET FOLIO = 0

CREATE PROCEDURE sPS_ObtieneFolioHost
@iOrigen tinyint = 0,
@iFolioHost int = 0 OUTPUT
AS
BEGIN
SET NOCOUNT ON
BEGIN TRAN MyTran
UPDATE FOLIADOR WITH (ROWLOCK)
SET FOLIO = ISNULL(FOLIO, 0) + 1
SELECT @iFolioHost = FOLIO FROM FOLIADOR ROWLOCK
COMMIT TRAN MyTran
IF @iOrigen = 1
SELECT @iFolioHost
END

SELECT FOLIO FROM FOLIADOR
sPS_ObtieneFolioHost 1, 0

CREATE TABLE IISLAS (FOLIO INT)

DECLARE @CONTADOR INT, @FOLIO INT
SET @CONTADOR = 0
WHILE @CONTADOR < 1000
BEGIN
EXEC sPS_ObtieneFolioHost 1, @FOLIO OUTPUT
INSERT INTO IISLAS VALUES(@FOLIO)
SET @CONTADOR = @CONTADOR +1
CONTINUE
END


TRUNCATE TABLE IISLAS
TRUNCATE TABLE AZARAGOZA

SELECT FOLIO FROM IISLAS WHERE FOLIO IN(SELECT ID_FOLIO FROM AZARAGOZA)


NOTA: Espero comentarios de los expertos, saludos.


Saludos
IIslas


"SystemBuilder" wrote:

Hola Amigos:

Tengo un store que hace un insert, no sin antes calcular el ultimo
indice de la tabla, para agregarle el siguiente, pero al usarlo en
otro equipo hace un conflicto, ya que hace duplicado de indice y me
bota el error de restriccion en primary key.

ALTER Procedure [dbo].[usp_Pub_Detalle_Guardar]
@Control numeric = null output,
@Sku varchar(50)
As
Declare @Cont Numeric
Set @Cont = (Select Max(Control) From PublicacionesDetalle)
If @Cont = 0 Or @Cont Is Null
Set @Control = 1
Else
Set @Control = @Cont + 1
Insert Into PublicacionesDetalle
(Control,ConPublic,Sku)
Values
(@Control,0,@Sku)

Puden ayudarme porfa???

Gracias,

SystemBuilder

Preguntas similares