Bonjour,
Je suis en train d’étudier la problématique des deadlocks. Un ami m’a mis au défi de provoquer un deadlock avec un mix de deux types d’isolation de transaction un « read commited » et l’autre en « serializable » avec la base de données configuré « read commited snapshot ».
Et donc j’essaye de provoquer cette erreur, mais je n’y arrive pas.
Voici le deadlock qui devrait être généré.
La table
Il y a un index pour sur noticeSending_fk qui n'est pas unique.
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 CREATE TABLE [asf_avis].[noticeFunctionalACK]( [noticeFunctionalACK_id] [int] IDENTITY(1,1) NOT NULL, [functionalACKStatusType_fk] [tinyint] NOT NULL, [ackReference] [nvarchar](20) NULL, [ackDate] [datetime] NULL, [noticeReceiptDate] [datetime] NULL, [nihilAttest] [bit] NULL, [noticeSending_fk] [int] NOT NULL, [party_fk] [int] NULL, CONSTRAINT [PK_noticeFunctionalACK] PRIMARY KEY CLUSTERED ( [noticeFunctionalACK_id] ASC ) ) ON [PRIMARY] CREATE NONCLUSTERED INDEX [IDX_FK_noticeSending_fk] ON [asf_avis].[noticeFunctionalACK] ( [noticeSending_fk] ASC ) GO
Le spid= 218 pose un lock "X"
Le spid= 436 pose un lock "RangeS-S"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SET TRANSACTION ISOLATION LEVEL READ COMMITTED BEGIN TRAN INSERT INTO [asf_avis].[noticeFunctionalACK] (noticeSending_fk,[ackReference],ackDate,noticeReceiptDate,[nihilAttest],functionalACKStatusType_fk) VALUES (2796, '31280313000002221', GETDATE() , GETDATE() , 1 , 1 )
suite spid 218 dans la même transaction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRAN DECLARE @count INT SELECT COUNT(*) FROM [asf_avis].[noticeFunctionalACK] ACK WHERE noticeSending_fk =2796 print @count
et la j'ai un locking qui se fait mais pas un deadlock ce que je comprends. mais alors comment provoquer ce dead lock?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 .......continue ......... SELECT noticeSending_fk,* FROM [asf_avis]. [noticeFunctionalACK] WHERE noticeSending_fk =2796
Merci de votre aide et partage de connaisance
Partager