Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/11/2010, 15h01   #1
Invité de passage
 
Inscription : février 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 16
Points : 2
Points : 2
Par défaut [SQLSERVER2008] Eclaircissement sur les locks

Bonjour,

Je suis loin d'être un spécialiste SQL et il y a un scénario de lock que je n'arrive pas à comprendre dans SQL Server 2008, donc je me tourne vers vous

Je crée d'abord une table bidon, sans index, ni primary key (important)
Code :
1
2
3
4
5
6
7
 
CREATE TABLE MaTable (col1 int)
INSERT INTO MaTable VALUES(1)
INSERT INTO MaTable VALUES(2)
INSERT INTO MaTable VALUES(3)
INSERT INTO MaTable VALUES(4)
INSERT INTO MaTable VALUES(5)

J'utilise SQL Server management studio et je lance une première Query avec une Transaction (sans commit) qui met à jour l'enregistrement de valeur 2:
Code :
1
2
3
BEGIN TRANSACTION
UPDATE MaTable SET Col1 = Col1 WHERE Col1 = 2 
Je lance alors une deuxième query
Code :
1
2
3
BEGIN TRANSACTION
UPDATE MaTable SET Col1 = Col1 WHERE Col1 = 3 

La deuxième query se mettra alors en attente tant que je ne commit pas la première

Après m'avoir arraché les cheveux, je suppose que la query 1, vu qu'il n y a pas d'index va scanner tout le contenu de la table, mais pourquoi est-ce que la table n'est pas libérée une fois le scan terminé ?

Y a t-il un autre moyen d'éviter ça sans utiliser d'index ?

Merci d'avance
fmichael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 15h22   #2
Membre habitué
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 135
Points : 135
Si tu ne mets pas de COMMIT, les verrous ne sont pas libérés.


Exemple :

cette transaction va durer 1 minutes

Code :
1
2
3
4
5
6
7
8
 
BEGIN TRANSACTION tr1
	UPDATE	MaTable
	SET	Description = 'Test'
	WHERE	ID = 1
	WAITFOR DELAY '00:01:00'
	PRINT 'fin transaction'
COMMIT TRANSACTION tr1

Le SELECT suivant exécuté juste après va être bloquée et ne pourra être exécutée qu'à la fin de la transaction précédente, qui durera 1 minute.

Code :
1
2
3
4
 
SELECT	*
FROM	MaTable
WHERE	ID = 1

Et je ne vois pas pourquoi tu ne veux mettre ni clé primaire, ni index sur tes tables.
Philippe Robert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 15h36   #3
Invité de passage
 
Inscription : février 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 16
Points : 2
Points : 2
Merci pour la réponse, mais la question que je me pose c'est pourquoi il verrouille tous les enregistrements de la table lors de la première query ?

Dans ton exemple, il travaille sur le même enregistrement, il est donc logique que ce soit verrouilé, mais pas toute la table quand meme ?


(bien sur, mettre une clé primaire est la moindre des choses, mais j'aimerais savoir pourquoi il ne fait pas un verrouillage par enregistrement uniquement dans ce cas)
fmichael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 16h43   #4
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 192
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 192
Points : 737
Points : 737
Sql Server a effectivement besoin d'indexes pour faire un lock plus granulaire.
Et c'est logique : non seulement il faut que Sql Server puisse facillement connaître les lignes lockées mais aussi puisse facillement accéder aux autres lignes ("contourner le lock").

Je te conseil par ailleurs de te renseigner sur le LOCK ESCALATION si tu es parti dans une appli gourmande.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 17h31   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 927
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 927
Points : 17 720
Points : 17 720
Pas nature les bases de données sont ensemblistes. Elles ont été conçue conformément à l'algèbre de Codd qui part de la théorie des ensembles. Or dans les ensembles mathématique il n'y a pas de notion d'ordre.

Lisez l'article que j'ai écrit à ce sujet :
http://blog.developpez.com/sqlpro/p5...sont-des-ense/

Dès lors en l'absence de clef primaire ou unique qui permet de repérer une ligne susceptible de "bouger" à tout moment, il faut verrouiller la table.

Vous devez donc comprendre que toute table devrait au moins avoir une clef !

Contrairement à une idée stupidement répandue, les mises à jour sans clef (INSERT, UPDATE, DELETE) sont pas nature plus lente et surtout induisent de la contention !
A lire :
http://blog.developpez.com/sqlpro/p7...d-index-ni-de/

Dans l'algèbre de Codd il n'est pas possible d'avoir une relation sans clef... Hélas dans les SGBDR il en va tout autrement...
Sans clef ce n'est pas une table, mais un fichier à la Cobol que vous manipulez... et encore !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 14h43   #6
Invité de passage
 
Inscription : février 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 16
Points : 2
Points : 2
En effet, vu comme ça, ça semble logique ... Merci beaucoup pour l'explication et les URL
fmichael est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h33.


 
 
 
 
Partenaires

Hébergement Web