Contexte
Afin de purger une table, deux solution sont possibles :
“TRUNCATE table Table_a_vider” ou “DELETE from Table_a_vider”
La principale différence entre ces deux commandes est la suivante :
- TRUNCATE est une commande DDL, cette commande est beaucoup plus rapide, mais son action est irrémédiable,
- DELETE est une commande DML, sa durée d’exécution dépends du volume de données à traiter.
Ces deux commandes ont malgré tout pour point commun de nécessiter un lock exclusif sur les données à supprimer. Si ce lock n’est pas obtenu, la commande vas continuer de s’exécuter jusqu’à l’obtenir.
Afin de ne pas attendre, il faut détecter la session provoquant le blocage et la stopper si possible.
Résolution
La commande suivante permet de lister toutes les transactions bloquées :
USE Master
GO
SELECT *
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
GO
La commande sp_who2 liste toute les sessions avec leur numéro de SPID, il suffit de retrouver la session remontée par la commande précédente puis de se référer à la colonne “BlkBy” afin d’identifier le process qui la bloque.
La commande suivante permet d’afficher la commande exécutée par le SPID indiqué, cela permet d’évaluer le risque avant de stopper la session à l’aide de la commande “kill”
dbcc inputbuffer(SPID)