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

Preguntas similare

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

Respuesta Responder a este mensaje
#2 Alejandro Mesa
01/08/2008 - 20:11 | Informe spam
Trata:

ALTER PROCEDURE [dbo].[usp_Pub_Detalle_Guardar]
@Control NUMERIC(18, 0) OUTPUT,
@Sku VARCHAR(50)
AS
SET NOCOUNT ON

DECLARE @MyTableVar TABLE (
Control NUMERIC(18, 0) NOT NULL
)

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRY
BEGIN TRANSACTION

INSERT INTO dbo.PublicacionesDetalle (Control, ConPublic, Sku)
OUTPUT INSERTED.Control INTO @MyTableVar
SELECT
ISNULL(MAX(Control), 0) + 1,
0,
@Sku
FROM
dbo.PublicacionesDetalle
WHERE
Control > 0

COMMIT TRANSACTION

SET @Control = (SELECT TOP 1 Control FROM @MyTableVar)

RETURN 0
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;

IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;

RETURN -1
END CATCH
GO

El desempenio de este procedimiento se vera afectado por el numero de filas
en la tabla.

AMB


"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

Respuesta Responder a este mensaje
#3 Alejandro Mesa
01/08/2008 - 20:16 | Informe spam
Algo que me llama la atencion pero que olvider preguntar, es por que usas
NUMERIC(18, 0) para la columna [Control]?

AMB

"Alejandro Mesa" wrote:

Trata:

ALTER PROCEDURE [dbo].[usp_Pub_Detalle_Guardar]
@Control NUMERIC(18, 0) OUTPUT,
@Sku VARCHAR(50)
AS
SET NOCOUNT ON

DECLARE @MyTableVar TABLE (
Control NUMERIC(18, 0) NOT NULL
)

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRY
BEGIN TRANSACTION

INSERT INTO dbo.PublicacionesDetalle (Control, ConPublic, Sku)
OUTPUT INSERTED.Control INTO @MyTableVar
SELECT
ISNULL(MAX(Control), 0) + 1,
0,
@Sku
FROM
dbo.PublicacionesDetalle
WHERE
Control > 0

COMMIT TRANSACTION

SET @Control = (SELECT TOP 1 Control FROM @MyTableVar)

RETURN 0
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;

IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;

RETURN -1
END CATCH
GO

El desempenio de este procedimiento se vera afectado por el numero de filas
en la tabla.

AMB


"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
>
Respuesta Responder a este mensaje
#4 Alejandro Mesa
01/08/2008 - 20:45 | Informe spam
Esta version no funciona. Probe insertar en un ciclo, en dos sesiones
concurrentes, y me dio error al tratar de insertar duplicados. Cambie el
nivel de transaccion y le deje el de por defecto (READ COMMITTED) y tambien
le agregue la sugerencia de tabla (updlock) y ahora me funciona sin problemas.

ALTER PROCEDURE [dbo].[usp_Pub_Detalle_Guardar]
@Control NUMERIC(18, 0) OUTPUT,
@Sku VARCHAR(50)
AS
SET NOCOUNT ON

DECLARE @MyTableVar TABLE (
Control NUMERIC(18, 0) NOT NULL
)

BEGIN TRY
BEGIN TRANSACTION

INSERT INTO dbo.PublicacionesDetalle (Control, ConPublic, Sku)
OUTPUT INSERTED.Control INTO @MyTableVar
SELECT
ISNULL(MAX(Control), 0) + 1,
0,
@Sku
FROM
dbo.PublicacionesDetalle WITH (UPDLOCK)
WHERE
Control > 0

COMMIT TRANSACTION

SET @Control = (SELECT TOP 1 Control FROM @MyTableVar)

RETURN 0
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;

IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;

RETURN -1
END CATCH
GO


AMB


"Alejandro Mesa" wrote:

Trata:

ALTER PROCEDURE [dbo].[usp_Pub_Detalle_Guardar]
@Control NUMERIC(18, 0) OUTPUT,
@Sku VARCHAR(50)
AS
SET NOCOUNT ON

DECLARE @MyTableVar TABLE (
Control NUMERIC(18, 0) NOT NULL
)

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRY
BEGIN TRANSACTION

INSERT INTO dbo.PublicacionesDetalle (Control, ConPublic, Sku)
OUTPUT INSERTED.Control INTO @MyTableVar
SELECT
ISNULL(MAX(Control), 0) + 1,
0,
@Sku
FROM
dbo.PublicacionesDetalle
WHERE
Control > 0

COMMIT TRANSACTION

SET @Control = (SELECT TOP 1 Control FROM @MyTableVar)

RETURN 0
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;

IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;

RETURN -1
END CATCH
GO

El desempenio de este procedimiento se vera afectado por el numero de filas
en la tabla.

AMB


"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
>
Respuesta Responder a este mensaje
#5 SystemBuilder
05/08/2008 - 16:53 | Informe spam
Hola Alejandro:

Gracias por responder:

Recien veo el mensaje, y es que el servidor cayo, creo que ya eran sus
ultimos dias, nos acompanio durante 5 anios aprox.

Cambie los campos numeric, ppor int... y solo queria decirte que,
ademas de eso tambien me falla un SP que selecciona registros.

te comento,

Mi tabla tiene 3 millones y medio de registros y dentro de una semana
tendra algo de 10 millones
Se supone que gracias al SP, cuando un equipo cliente esta solicitando
informacion, al correr el otro equipo sl SP, este esta en espera, o me
equivoco?
Pero bueno, en un momento dado, cuando los equipo cliente recaban
informacion, el SQL cae con el TIEMPO DE ESPERA

Gracias por tu ayuda.

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