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 :
Est ce que quelqu'un peut me dire ce qui ne va pas dans le code?Transaction (Process ID 59) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
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
Partager