232
Chapitre 7. Transactions et verrous
La valeur de l’option « blocked process threshold » est exprimée en secondes. Elle
indique à partir de quelle durée de blocage un événement sera déclenché : dans
l’exemple précédent, après 30 secondes, et chaque 30 secondes suivantes, jusqu’à ce
que le blocage soit libéré.
En général, un blocage en provoque d’autres à son tour, produisant une chaîne de
processus bloqués les uns par les autres. L’événement BLOCKED_PROCESS_REPORT ne
montre pas cette chaîne, il se produit pour chaque processus bloqué, individuellement.
Vous devez mettre en place la notification. La fonctionnalité d’event notification
est basée sur Service Broker, un système orienté service d’échanges de messages intégré à SQL Server (un concept parfois nommé SODA : Service Oriented Database
Architecture). La description de Service Broker sortant du cadre de cet ouvrage, nous
nous contenterons de vous montrer comment mettre pratiquement en œuvre une
notification d’événement. Vous devez, dans l’ordre, mettre en place une file
d’attente Service Broker, un service, éventuellement une route pour indiquer où les
messages seront dirigés. Dans l’exemple suivant, les noms d’objet (queue, service…)
peuvent êtres modifiés, seul le nom du contrat ([http://schemas.microsoft.com/SQL/
Notifications/PostEventNotification]) est fixé.
CREATE QUEUE NotifyQueue ;
GO
CREATE SERVICE NotifyService
ON QUEUE NotifyQueue
([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
GO
CREATE ROUTE NotifyRoute
WITH SERVICE_NAME = 'NotifyService',
ADDRESS = 'LOCAL';
GO
CREATE EVENT NOTIFICATION BlockedProcessReport
ON SERVER
WITH fan_in
FOR BLOCKED_PROCESS_REPORT
TO SERVICE 'NotifyService', 'current database';
GO
L’information du blocage sera transmise par Service Broker sous forme d’un document XML qui sera placé dans la file d’attente NotifyQueue. Testons-le en créant une
table puis en insérant une ligne dans une session après avoir démarré une transaction
explicite. Dans une autre session, essayons de lire la table (dans un niveau d’isolation au moins équivalant à READ COMMITTED) :
USE sandbox
GO
Chapitre 7. Transactions et verrous
La valeur de l’option « blocked process threshold » est exprimée en secondes. Elle
indique à partir de quelle durée de blocage un événement sera déclenché : dans
l’exemple précédent, après 30 secondes, et chaque 30 secondes suivantes, jusqu’à ce
que le blocage soit libéré.
En général, un blocage en provoque d’autres à son tour, produisant une chaîne de
processus bloqués les uns par les autres. L’événement BLOCKED_PROCESS_REPORT ne
montre pas cette chaîne, il se produit pour chaque processus bloqué, individuellement.
Vous devez mettre en place la notification. La fonctionnalité d’event notification
est basée sur Service Broker, un système orienté service d’échanges de messages intégré à SQL Server (un concept parfois nommé SODA : Service Oriented Database
Architecture). La description de Service Broker sortant du cadre de cet ouvrage, nous
nous contenterons de vous montrer comment mettre pratiquement en œuvre une
notification d’événement. Vous devez, dans l’ordre, mettre en place une file
d’attente Service Broker, un service, éventuellement une route pour indiquer où les
messages seront dirigés. Dans l’exemple suivant, les noms d’objet (queue, service…)
peuvent êtres modifiés, seul le nom du contrat ([http://schemas.microsoft.com/SQL/
Notifications/PostEventNotification]) est fixé.
CREATE QUEUE NotifyQueue ;
GO
CREATE SERVICE NotifyService
ON QUEUE NotifyQueue
([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
GO
CREATE ROUTE NotifyRoute
WITH SERVICE_NAME = 'NotifyService',
ADDRESS = 'LOCAL';
GO
CREATE EVENT NOTIFICATION BlockedProcessReport
ON SERVER
WITH fan_in
FOR BLOCKED_PROCESS_REPORT
TO SERVICE 'NotifyService', 'current database';
GO
L’information du blocage sera transmise par Service Broker sous forme d’un document XML qui sera placé dans la file d’attente NotifyQueue. Testons-le en créant une
table puis en insérant une ligne dans une session après avoir démarré une transaction
explicite. Dans une autre session, essayons de lire la table (dans un niveau d’isolation au moins équivalant à READ COMMITTED) :
USE sandbox
GO
