[SQL2K] Deadlock sur transaction
Bonjour à tous.
J'ai une procédure stockée qui me permet de générer des numéros uniques.
Elle est utilisée par une dizaine d'application en même temps sur la base et est appellée plusieurs fois par seconde.
Le problème est que j'ai des deadlock :
Citation:
Transaction (Process ID 59) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Est ce que quelqu'un peut me dire ce qui ne va pas dans le code?
Merci.
Voici son code.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
CREATE Procedure [dbo].[spr_getcounter]
@countername AS VARCHAR(128),
@countervalue AS BIGINT = NULL OUTPUT
AS
DECLARE @strQuery VARCHAR(8000)
DECLARE @ok INT
SET @ok = 0
DECLARE @nextvalue INT
SET @nextvalue = -1
SET NOCOUNT ON
-- Highest transaction level. Only one connection can enter this at the same time
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN GET_COUNTER
-- Search for coutername entry in counter table
SET @ok = 0
SELECT @ok = COUNT(*) FROM tbl_counters WHERE cnt_name = @countername
-- Insert countername entry if necessary
IF @ok = 0
BEGIN
SET @strQuery = 'INSERT INTO tbl_counters (cnt_name, cnt_lastvalue) VALUES (''' + @countername + ''', 0)'
EXEC(@strQuery)
END
-- Getting next counter value
SELECT @nextvalue = cnt_lastvalue + 1 FROM tbl_counters WHERE cnt_name = @countername
-- Update last value in counters table
UPDATE tbl_counters SET cnt_lastvalue = @nextvalue WHERE cnt_name = @countername
-- Return counter
SET @countervalue = @nextvalue
-- Commit transaction
COMMIT TRAN GET_COUNTER
SET NOCOUNT OFF
RETURN 0
ERROR_HANDLER:
ROLLBACK TRAN GET_COUNTER
SET NOCOUNT OFF
RETURN -1 |