>Il problema è che se questa viene chiamata in contemporanea da
>più utenti, nonostante sia presente una transaction, viene eseguita
>in contemporanea, con il risultato che più utenti ricevono il
>medesimo nuovo codice.
>Potete aiutarmi?
Ciao Mauro,
Prova a vedere se con questa procedura la situazione migliora:
USE tempdb;
CREATE TABLE dbo.CodiciCom(
Anno smallint NOT NULL,
Tipo varchar(10) NOT NULL,
Numero int NOT NULL
);
GO
CREATE PROCEDURE dbo.up_AddCodiciCom(
@Tipo varchar(20),
@NumeroFinale int output,
@Anno smallint output
)
AS
SET @Anno = YEAR(CURRENT_TIMESTAMP);
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRY
BEGIN TRAN;
UPDATE dbo.CodiciCom
SET @NumeroFinale = Numero = Numero + 1
WHERE Tipo = @Tipo
AND Anno = @Anno;
IF @@ROWCOUNT = 0 BEGIN
SET @NumeroFinale = 1
INSERT dbo.CodiciCom
VALUES (@Anno, @Tipo, @NumeroFinale);
END
COMMIT TRAN;
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
ROLLBACK TRAN;
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;
GO
DECLARE @Numero int, @Anno smallint;
EXEC dbo.up_AddCodiciCom 'Tipo 1', @Numero OUTPUT, @Anno OUTPUT;
SELECT @Numero AS Numero, @Anno AS Anno;
EXEC dbo.up_AddCodiciCom 'Tipo 1', @Numero OUTPUT, @Anno OUTPUT;
SELECT @Numero AS Numero, @Anno AS Anno;
EXEC dbo.up_AddCodiciCom 'Tipo 1', @Numero OUTPUT, @Anno OUTPUT;
SELECT @Numero AS Numero, @Anno AS Anno;
EXEC dbo.up_AddCodiciCom 'Tipo 2', @Numero OUTPUT, @Anno OUTPUT;
SELECT @Numero AS Numero, @Anno AS Anno;
EXEC dbo.up_AddCodiciCom 'Tipo 2', @Numero OUTPUT, @Anno OUTPUT;
SELECT @Numero AS Numero, @Anno AS Anno;
/* Output:
(0 row(s) affected)
(1 row(s) affected)
Numero Anno
----------- ------
1 2008
(1 row(s) affected)
(1 row(s) affected)
Numero Anno
----------- ------
2 2008
(1 row(s) affected)
(1 row(s) affected)
Numero Anno
----------- ------
3 2008
(1 row(s) affected)
(0 row(s) affected)
(1 row(s) affected)
Numero Anno
----------- ------
1 2008
(1 row(s) affected)
(1 row(s) affected)
Numero Anno
----------- ------
2 2008
(1 row(s) affected)
*/
SELECT *
FROM dbo.CodiciCom;
/* Output:
Anno Tipo Numero
------ ---------- -----------
2008 Tipo 1 3
2008 Tipo 2 2
(2 row(s) affected)
*/
DROP PROCEDURE dbo.up_AddCodiciCom;
DROP TABLE dbo.CodiciCom;
>Grazie a tutti come al solito per la vs. collaborazione
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org