Conception Et Réalisation (SQL Server) by Grare Stéphane - HTML preview

PLEASE NOTE: This is an HTML preview only and some elements such as links or page numbers may be incorrect.
Download the book in PDF, ePub, Kindle for a complete version.

Verrouillages dans SQL Server

Lors de transactions concurrentes, des verrous peuvent être posés pour éviter les situations

suivantes :

Mise à jour perdue : Une mise à jour peut être perdue lorsqu’une transaction écrase les

modifications effectuées par une autre transaction.

Lecture incorrecte : Se produit lorsqu’une transaction lit des données non validées

provenant d’une autre transaction.

Lecture non renouvelable : Se produit lorsque, une transaction devant lire la même ligne

plusieurs fois, la ligne est modifiée par une autre transaction et donc produit des valeurs

différentes à chaque lecture.

Lectures fantômes : Se produit lorsqu’une autre transaction insert une ligne au sein de la

transaction en cours.

Un verrou partagé appliqué à une ressource par une première transaction autorise

l’acquisition par une deuxième transaction d’un verrou partagé sur cette ressource, même si

la première transaction n’est pas terminée. Un verrou partagé sur une ligne est libéré dès la

lecture de la ligne suivante.

Un verrou partagé est alloué pour une instruction SELECT.

SQL Server utilise des verrous exclusifs lorsqu’une instruction INSERT, DELETE ou

UPDATE est exécutée.

Une seule transaction peut acquérir un verrou exclusif sur une ressource ; une transaction ne

peut pas acquérir un verrou exclusif sur une ressource tant qu’il existe des verrous partagés ;

Une transaction ne peut pas acquérir un verrou partagé sur une ressource déjà pourvue d’un

verrou exclusif.

182

SQL Server permet de définir un niveau d’isolement qui protège une transaction vis-à-vis des

autres.

SET TRANSACTION ISOLATION LEVEL {READ COMMITTED | READ UNCOMMITTED |

REPEATABLE READ | SNAPSHOT | SERIALIZABLE}

Read UnCommitted : Indique à SQL Server de ne pas placer de verrous partagés : Une

transaction peut lire des données modifiées non encore validées par une autre transaction.

Des lectures incorrectes peuvent se produire.

Read Committed (Option par défaut) : Indique à SQL Server d’utiliser des verrous

partagés pendant la lecture : une transaction ne peut pas lire les données modifiées, mais

non validées d’une autre transaction. La lecture incorrecte ne peut pas se produire.

Repeatable Read : SQL Server place des verrous partagés sur toutes les données lues par

chaque instruction de la transaction et les maintient jusqu'à la fin de la transaction : Une

transaction ne peut pas lire des données modifiées, mais pas encore validées par une autre

transaction, et ne peut modifier les données lues par la transaction active tant que celle-ci

n'est pas terminée.

La lecture incorrecte et la lecture non renouvelable ne peuvent pas se produire.

Snapshot : Une transaction n’a pas accès aux modifications de données apportées par une

autre transaction : Les données vues par la première transaction sont les données antérieures

au début de la deuxième transaction.

Serializable : Une transaction ne peut pas lire des données modifiées, mais pas encore

validées par une autre transaction, et ne peut modifier les données lues par la transaction

active tant que celle-ci n'est pas terminée.

Une transaction ne peut pas insérer de nouvelles lignes avec des valeurs de clés comprises

dans le groupe de clés lues par des instructions de la transaction active, tant que celle-ci n'est

pas terminée.

La lecture incorrecte la lecture non renouvelable et les lectures fantômes ne peuvent pas se

produire.

Exemple : La transaction de l’exemple suivant n’est pas terminée, mais nous avons utilisé

l’option READ UNCOMMITTED.

USE Papyrus

GO

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

GO

BEGIN TRAN

PRINT 'Valeur de Trancount: ' + CAST(@@TRANCOUNT AS varchar(5))

PRINT 'Avant Maj : '

SELECT NOMFOU FROM vente.FOURNISSEUR WHERE NUMFOU = 120

UPDATE vente.FOURNISSEUR SET NOMFOU = 'GROSBRIBAN' WHERE NUMFOU = 120

PRINT 'Après Maj : '

SELECT NOMFOU FROM vente.FOURNISSEUR WHERE NUMFOU = 120

PRINT 'Valeur de Trancount : ' + CAST(@@TRANCOUNT AS varchar(5))

Nous interrogeons notre table FOURNISSEUR.

SELECT *

FROM vente.FOURNISSEUR

WHERE NUMFOU = 120

183

index-184_1.png

Cependant, on peut toujours annuler la transaction ou la valider par les instructions COMMIT

TRAN ou ROLLBACK TRAN.

Le niveau d’isolement spécifie le comportement de verrouillage par défaut de toutes les

instructions de la session (connexion).

Plus le niveau d’isolement est élevé, plus les verrous sont maintenus longtemps et plus ils

sont restrictifs.

La commande DBCC USEROPTIONS renvoie entre autres, le niveau d’isolement de la

session.

Il est possible de définir la durée maximale pendant laquelle SQL Server permet à une

transaction d’attendre le déverrouillage d’une ressource bloquée. La variable globale

@@lock_timeout donne le temps d’attente défini.

SET LOCK_TIMEOUT délai_attente positionne le délai, en millisecondes, avant que ne soit

renvoyé un message d’erreur (-1 indique qu’il n’y a pas de délai par défaut).