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 :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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