235
7.5 Blocages et deadlocks
report_time datetime NOT NULL,
database_id int NOT NULL,
process xml NOT NULL
);
DECLARE @rowcount int;
RECEIVE cast( message_body as xml ) as message_body,
cast( message_body as xml ).value( '(/EVENT_INSTANCE/PostTime)[1]',
'datetime' ) as report_time,
cast( message_body as xml ).value( '(/EVENT_INSTANCE/DatabaseID)[1]',
'int' ) as database_id,
cast( message_body as xml ).query( '/EVENT_INSTANCE/TextData/blockedprocess-report/blocked-process/process' ) as process
FROM NotifyQueue
INTO @BlockedProcesses;
SET @rowcount = @@ROWCOUNT
INSERT INTO dbo.BlockedProcesses
SELECT * FROM @BlockedProcesses;
IF (@rowcount <> @@ROWCOUNT)
ROLlBACK
ELSE
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
Vous pouvez bien sûr utiliser Database Mail (sp_send_dbmail) pour vous notifier.
Comment éviter les blocages
Les blocages très courts sont inévitables en environnement concurrentiel, ils ne posent en
général pas de problème sérieux. Par contre, nous l’avons vu, il faut autant que possible éviter
les blocages longs. Pour cela, il faut optimiser le code SQL et créer de bons index pour diminuer la durée des transactions. Il faut aussi savoir jouer sur le niveau d’isolation des transactions. Les niveaux READ UNCOMMITTED et SNAPSHOT (ou READ COMMITTED SNAPSHOT) sont précieux.
7.5.2 Verrous mortels
Les verrous mortels, ou deadlocks, aussi poétiquement appelés étreintes fatales, ou
moins poétiquement interblocages, sont des animaux particuliers qu’on rencontre
occasionnellement dans les buissons des applications transactionnelles. Ils ressemblent un peu aux scénarios des westerns qui respectent l’unité de lieu, comme Rio
Bravo. Dans la dernière partie de ce film d’Howard Hawks, les bons, menés par le
shérif John T. Chance, détiennent en otage le frère du chef des méchants, Nathan
Burdette. Et les méchants se sont emparés de l’adjoint du shérif, Dude. Burdette ne
libérera Dude que si Chance lui rend son frère, et Chance ne libérera le frère que si
Burdette rend à Dude sa liberté. Nous savons que dans ce genre de situation, il n’y a
qu’une échappatoire : un des deux chefs doit mourir (mauvais exemple ici, car
Burdette ne meurt pas).
7.5 Blocages et deadlocks
report_time datetime NOT NULL,
database_id int NOT NULL,
process xml NOT NULL
);
DECLARE @rowcount int;
RECEIVE cast( message_body as xml ) as message_body,
cast( message_body as xml ).value( '(/EVENT_INSTANCE/PostTime)[1]',
'datetime' ) as report_time,
cast( message_body as xml ).value( '(/EVENT_INSTANCE/DatabaseID)[1]',
'int' ) as database_id,
cast( message_body as xml ).query( '/EVENT_INSTANCE/TextData/blockedprocess-report/blocked-process/process' ) as process
FROM NotifyQueue
INTO @BlockedProcesses;
SET @rowcount = @@ROWCOUNT
INSERT INTO dbo.BlockedProcesses
SELECT * FROM @BlockedProcesses;
IF (@rowcount <> @@ROWCOUNT)
ROLlBACK
ELSE
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
Vous pouvez bien sûr utiliser Database Mail (sp_send_dbmail) pour vous notifier.
Comment éviter les blocages
Les blocages très courts sont inévitables en environnement concurrentiel, ils ne posent en
général pas de problème sérieux. Par contre, nous l’avons vu, il faut autant que possible éviter
les blocages longs. Pour cela, il faut optimiser le code SQL et créer de bons index pour diminuer la durée des transactions. Il faut aussi savoir jouer sur le niveau d’isolation des transactions. Les niveaux READ UNCOMMITTED et SNAPSHOT (ou READ COMMITTED SNAPSHOT) sont précieux.
7.5.2 Verrous mortels
Les verrous mortels, ou deadlocks, aussi poétiquement appelés étreintes fatales, ou
moins poétiquement interblocages, sont des animaux particuliers qu’on rencontre
occasionnellement dans les buissons des applications transactionnelles. Ils ressemblent un peu aux scénarios des westerns qui respectent l’unité de lieu, comme Rio
Bravo. Dans la dernière partie de ce film d’Howard Hawks, les bons, menés par le
shérif John T. Chance, détiennent en otage le frère du chef des méchants, Nathan
Burdette. Et les méchants se sont emparés de l’adjoint du shérif, Dude. Burdette ne
libérera Dude que si Chance lui rend son frère, et Chance ne libérera le frère que si
Burdette rend à Dude sa liberté. Nous savons que dans ce genre de situation, il n’y a
qu’une échappatoire : un des deux chefs doit mourir (mauvais exemple ici, car
Burdette ne meurt pas).
