OVH Cloud OVH Cloud

Verrous: scénario simplifié.

6 réponses
Avatar
carjo12
Bonjour

Je dois implémenter des verrous dans ma base de données. J’ai lu la
documentation SQL sur le sujet, et comme elle offre beaucoup de possibilités
et qu’une telle action s’avère délicate, j’aimerais vous soumettre un
scénario simplifié d’implémentation de verrous afin d’avoir votre avis.

Contexte :

La base de données contient 3 tables (T1, T2 et T3) dont le schéma est
organisé en « flocon ».
Trois clients requièrent des ressources, soit pour faire une mise à jour,
soit pour lire les données.
Quotidiennement et à heure fixe, une synchronisation est faite sur
l’ensemble des tables.

Voici des actions simultanées possibles :

Action #1 - Client #1:

Update T1 WITH (UPDLOCK)
Set champ1 = @ch1
From T1
Where T1.id = @id

Update T2 WITH (UPDLOCK)….idem
Update T3 WITH (UPDLOCK)… idem

Action #2 - Client #2:

Update T1 WITH (UPDLOCK)… idem
Update T2 WITH (UPDLOCK)… idem
Update T3 WITH (UPDLOCK)… idem

Action #3 - Client #3 :

Select * from T1, T2, T3 WITH (READPAST | NOLOCK)

Action #4 - Synchronisation automatique des nouvelles données :

Insert into T1 values ……
Insert into T2 values ……
Insert into T3 values ……

1-Serait-ce un scénario envisageable? Quelles pourraient être les problèmes
d’un tel contexte?

2-Doit-on utiliser le type de verrou READPAST ou NOLOCK lors de la lecture
dans ce contexte?

3-Doit-on mettre un verrou lors des transactions d’insertion?

Merci à l’avance pour votre aide.

6 réponses

Avatar
Philippe T [MS]
Bonjour,

Pourquoi ne pas simplement gérer des transactions et laisser SQL gérés ses
verrous ?

Lors d'un INSERT, pas besoin de verrous.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"carjo12" wrote in message
news:
Bonjour

Je dois implémenter des verrous dans ma base de données. J'ai lu la
documentation SQL sur le sujet, et comme elle offre beaucoup de
possibilités
et qu'une telle action s'avère délicate, j'aimerais vous soumettre un
scénario simplifié d'implémentation de verrous afin d'avoir votre avis.

Contexte :

La base de données contient 3 tables (T1, T2 et T3) dont le schéma est
organisé en « flocon ».
Trois clients requièrent des ressources, soit pour faire une mise à jour,
soit pour lire les données.
Quotidiennement et à heure fixe, une synchronisation est faite sur
l'ensemble des tables.

Voici des actions simultanées possibles :

Action #1 - Client #1:

Update T1 WITH (UPDLOCK)
Set champ1 = @ch1
From T1
Where T1.id = @id

Update T2 WITH (UPDLOCK)..idem
Update T3 WITH (UPDLOCK). idem

Action #2 - Client #2:

Update T1 WITH (UPDLOCK). idem
Update T2 WITH (UPDLOCK). idem
Update T3 WITH (UPDLOCK). idem

Action #3 - Client #3 :

Select * from T1, T2, T3 WITH (READPAST | NOLOCK)

Action #4 - Synchronisation automatique des nouvelles données :

Insert into T1 values ..
Insert into T2 values ..
Insert into T3 values ..

1-Serait-ce un scénario envisageable? Quelles pourraient être les
problèmes
d'un tel contexte?

2-Doit-on utiliser le type de verrou READPAST ou NOLOCK lors de la lecture
dans ce contexte?

3-Doit-on mettre un verrou lors des transactions d'insertion?

Merci à l'avance pour votre aide.











Avatar
carjo12
Dans ce cas, qu'est-ce qui arrive si 2 personnes effectuent une mise à jour
en même temps, sur la même ligne?

Merci.

"Philippe T [MS]" a écrit :

Bonjour,

Pourquoi ne pas simplement gérer des transactions et laisser SQL gérés ses
verrous ?

Lors d'un INSERT, pas besoin de verrous.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"carjo12" wrote in message
news:
> Bonjour
>
> Je dois implémenter des verrous dans ma base de données. J'ai lu la
> documentation SQL sur le sujet, et comme elle offre beaucoup de
> possibilités
> et qu'une telle action s'avère délicate, j'aimerais vous soumettre un
> scénario simplifié d'implémentation de verrous afin d'avoir votre avis.
>
> Contexte :
>
> La base de données contient 3 tables (T1, T2 et T3) dont le schéma est
> organisé en « flocon ».
> Trois clients requièrent des ressources, soit pour faire une mise à jour,
> soit pour lire les données.
> Quotidiennement et à heure fixe, une synchronisation est faite sur
> l'ensemble des tables.
>
> Voici des actions simultanées possibles :
>
> Action #1 - Client #1:
>
> Update T1 WITH (UPDLOCK)
> Set champ1 = @ch1
> From T1
> Where T1.id = @id
>
> Update T2 WITH (UPDLOCK)..idem
> Update T3 WITH (UPDLOCK). idem
>
> Action #2 - Client #2:
>
> Update T1 WITH (UPDLOCK). idem
> Update T2 WITH (UPDLOCK). idem
> Update T3 WITH (UPDLOCK). idem
>
> Action #3 - Client #3 :
>
> Select * from T1, T2, T3 WITH (READPAST | NOLOCK)
>
> Action #4 - Synchronisation automatique des nouvelles données :
>
> Insert into T1 values ..
> Insert into T2 values ..
> Insert into T3 values ..
>
> 1-Serait-ce un scénario envisageable? Quelles pourraient être les
> problèmes
> d'un tel contexte?
>
> 2-Doit-on utiliser le type de verrou READPAST ou NOLOCK lors de la lecture
> dans ce contexte?
>
> 3-Doit-on mettre un verrou lors des transactions d'insertion?
>
> Merci à l'avance pour votre aide.
>
>
>
>
>
>
>
>
>





Avatar
Fred BROUARD
Tout dépend de la façons dont cette MAJ est faites.

Si c'est à travers un curseur (par exemple en client connecté tel que VB,
Delphi, C++, C#...) alors l'un des deux sera rejeté (verrous optimiste) avec un
message du genre : la version de la ligne considérée à changée, impossiblme de
mettre à jour.

Si client déconnecté alors les 2 maj se feront successivement.

Ne jamais utiliser directement les verrous, c'est comme cela que l'on tue une
base de données.

Lire sur les transactions en général :
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1

Sur les verrous SQL Server et les transactions SQL Server :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L4.5

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


carjo12 a écrit:
Dans ce cas, qu'est-ce qui arrive si 2 personnes effectuent une mise à jour
en même temps, sur la même ligne?

Merci.

"Philippe T [MS]" a écrit :


Bonjour,

Pourquoi ne pas simplement gérer des transactions et laisser SQL gérés ses
verrous ?

Lors d'un INSERT, pas besoin de verrous.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"carjo12" wrote in message
news:

Bonjour

Je dois implémenter des verrous dans ma base de données. J'ai lu la
documentation SQL sur le sujet, et comme elle offre beaucoup de
possibilités
et qu'une telle action s'avère délicate, j'aimerais vous soumettre un
scénario simplifié d'implémentation de verrous afin d'avoir votre avis.

Contexte :

La base de données contient 3 tables (T1, T2 et T3) dont le schéma est
organisé en « flocon ».
Trois clients requièrent des ressources, soit pour faire une mise à jour,
soit pour lire les données.
Quotidiennement et à heure fixe, une synchronisation est faite sur
l'ensemble des tables.

Voici des actions simultanées possibles :

Action #1 - Client #1:

Update T1 WITH (UPDLOCK)
Set champ1 = @ch1
From T1
Where T1.id = @id

Update T2 WITH (UPDLOCK)..idem
Update T3 WITH (UPDLOCK). idem

Action #2 - Client #2:

Update T1 WITH (UPDLOCK). idem
Update T2 WITH (UPDLOCK). idem
Update T3 WITH (UPDLOCK). idem

Action #3 - Client #3 :

Select * from T1, T2, T3 WITH (READPAST | NOLOCK)

Action #4 - Synchronisation automatique des nouvelles données :

Insert into T1 values ..
Insert into T2 values ..
Insert into T3 values ..

1-Serait-ce un scénario envisageable? Quelles pourraient être les
problèmes
d'un tel contexte?

2-Doit-on utiliser le type de verrou READPAST ou NOLOCK lors de la lecture
dans ce contexte?

3-Doit-on mettre un verrou lors des transactions d'insertion?

Merci à l'avance pour votre aide.


















Avatar
carjo12
Merci beaucoup pour les informations et les liens. Toutefois, pourriez-vous
me préciser certains points que vous avez mentionnés, svp?

Les clients sont connectés en SQL. La MAJ est très simple et standard, sans
curseur, du genre:

Update T1
Set champ1 = @ch1
From T1
Where T1.id = @id

1 - Qu'entendez-vous par "client déconnecté"? Si les MAJ se font
successivement, alors il n'y a pas de problèmes de concurrence ?

2 - Si j'ai bien compris votre message, avec la façon décrite plus haut de
faire le Update,
a - SQL posera des verrous pessimistes, et le succès de la transaction
sera assuré
b - Il est préférable de ne pas "personnaliser" l'implémentation de
verrous dans la BD...

Merci de vos précisions.

"Fred BROUARD" a écrit :

Tout dépend de la façons dont cette MAJ est faites.

Si c'est à travers un curseur (par exemple en client connecté tel que VB,
Delphi, C++, C#...) alors l'un des deux sera rejeté (verrous optimiste) avec un
message du genre : la version de la ligne considérée à changée, impossiblme de
mettre à jour.

Si client déconnecté alors les 2 maj se feront successivement.

Ne jamais utiliser directement les verrous, c'est comme cela que l'on tue une
base de données.

Lire sur les transactions en général :
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1

Sur les verrous SQL Server et les transactions SQL Server :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L4.5

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


carjo12 a écrit:
> Dans ce cas, qu'est-ce qui arrive si 2 personnes effectuent une mise à jour
> en même temps, sur la même ligne?
>
> Merci.
>
> "Philippe T [MS]" a écrit :
>
>
>>Bonjour,
>>
>>Pourquoi ne pas simplement gérer des transactions et laisser SQL gérés ses
>>verrous ?
>>
>>Lors d'un INSERT, pas besoin de verrous.
>>
>>----------------------------------------------------------------------
>>Philippe TROTIN - Microsoft Service France
>>
>>"carjo12" wrote in message
>>news:
>>
>>>Bonjour
>>>
>>>Je dois implémenter des verrous dans ma base de données. J'ai lu la
>>>documentation SQL sur le sujet, et comme elle offre beaucoup de
>>>possibilités
>>>et qu'une telle action s'avère délicate, j'aimerais vous soumettre un
>>>scénario simplifié d'implémentation de verrous afin d'avoir votre avis.
>>>
>>>Contexte :
>>>
>>>La base de données contient 3 tables (T1, T2 et T3) dont le schéma est
>>>organisé en « flocon ».
>>>Trois clients requièrent des ressources, soit pour faire une mise à jour,
>>>soit pour lire les données.
>>>Quotidiennement et à heure fixe, une synchronisation est faite sur
>>>l'ensemble des tables.
>>>
>>>Voici des actions simultanées possibles :
>>>
>>>Action #1 - Client #1:
>>>
>>>Update T1 WITH (UPDLOCK)
>>>Set champ1 = @ch1
>>>From T1
>>>Where T1.id = @id
>>>
>>>Update T2 WITH (UPDLOCK)..idem
>>>Update T3 WITH (UPDLOCK). idem
>>>
>>>Action #2 - Client #2:
>>>
>>>Update T1 WITH (UPDLOCK). idem
>>>Update T2 WITH (UPDLOCK). idem
>>>Update T3 WITH (UPDLOCK). idem
>>>
>>>Action #3 - Client #3 :
>>>
>>>Select * from T1, T2, T3 WITH (READPAST | NOLOCK)
>>>
>>>Action #4 - Synchronisation automatique des nouvelles données :
>>>
>>>Insert into T1 values ..
>>>Insert into T2 values ..
>>>Insert into T3 values ..
>>>
>>>1-Serait-ce un scénario envisageable? Quelles pourraient être les
>>>problèmes
>>>d'un tel contexte?
>>>
>>>2-Doit-on utiliser le type de verrou READPAST ou NOLOCK lors de la lecture
>>>dans ce contexte?
>>>
>>>3-Doit-on mettre un verrou lors des transactions d'insertion?
>>>
>>>Merci à l'avance pour votre aide.
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>
>>
>>




Avatar
Fred BROUARD
carjo12 a écrit:
Merci beaucoup pour les informations et les liens. Toutefois, pourriez-vous
me préciser certains points que vous avez mentionnés, svp?

Les clients sont connectés en SQL. La MAJ est très simple et standard, sans
curseur, du genre:

Update T1
Set champ1 = @ch1
From T1
Where T1.id = @id

1 - Qu'entendez-vous par "client déconnecté"? Si les MAJ se font
successivement, alors il n'y a pas de problèmes de concurrence ?



aucun


2 - Si j'ai bien compris votre message, avec la façon décrite plus haut de
faire le Update,
a - SQL posera des verrous pessimistes, et le succès de la transaction
sera assuré
b - Il est préférable de ne pas "personnaliser" l'implémentation de
verrous dans la BD...



Jamais de verouillage explicite


Merci de vos précisions.

"Fred BROUARD" a écrit :


Tout dépend de la façons dont cette MAJ est faites.

Si c'est à travers un curseur (par exemple en client connecté tel que VB,
Delphi, C++, C#...) alors l'un des deux sera rejeté (verrous optimiste) avec un
message du genre : la version de la ligne considérée à changée, impossiblme de
mettre à jour.

Si client déconnecté alors les 2 maj se feront successivement.

Ne jamais utiliser directement les verrous, c'est comme cela que l'on tue une
base de données.

Lire sur les transactions en général :
http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1

Sur les verrous SQL Server et les transactions SQL Server :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L4.5

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


carjo12 a écrit:

Dans ce cas, qu'est-ce qui arrive si 2 personnes effectuent une mise à jour
en même temps, sur la même ligne?

Merci.

"Philippe T [MS]" a écrit :



Bonjour,

Pourquoi ne pas simplement gérer des transactions et laisser SQL gérés ses
verrous ?

Lors d'un INSERT, pas besoin de verrous.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"carjo12" wrote in message
news:


Bonjour

Je dois implémenter des verrous dans ma base de données. J'ai lu la
documentation SQL sur le sujet, et comme elle offre beaucoup de
possibilités
et qu'une telle action s'avère délicate, j'aimerais vous soumettre un
scénario simplifié d'implémentation de verrous afin d'avoir votre avis.

Contexte :

La base de données contient 3 tables (T1, T2 et T3) dont le schéma est
organisé en « flocon ».
Trois clients requièrent des ressources, soit pour faire une mise à jour,
soit pour lire les données.
Quotidiennement et à heure fixe, une synchronisation est faite sur
l'ensemble des tables.

Voici des actions simultanées possibles :

Action #1 - Client #1:

Update T1 WITH (UPDLOCK)
Set champ1 = @ch1



From T1



Where T1.id = @id

Update T2 WITH (UPDLOCK)..idem
Update T3 WITH (UPDLOCK). idem

Action #2 - Client #2:

Update T1 WITH (UPDLOCK). idem
Update T2 WITH (UPDLOCK). idem
Update T3 WITH (UPDLOCK). idem

Action #3 - Client #3 :

Select * from T1, T2, T3 WITH (READPAST | NOLOCK)

Action #4 - Synchronisation automatique des nouvelles données :

Insert into T1 values ..
Insert into T2 values ..
Insert into T3 values ..

1-Serait-ce un scénario envisageable? Quelles pourraient être les
problèmes
d'un tel contexte?

2-Doit-on utiliser le type de verrou READPAST ou NOLOCK lors de la lecture
dans ce contexte?

3-Doit-on mettre un verrou lors des transactions d'insertion?

Merci à l'avance pour votre aide.
























--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
carjo12
Merci Fred et Philippe.

Dans le cas où les clients passent par une application Labview lors de deux
MAJ simultanées ou encore lors d'insertion et de MAJ simultanée, j'obtiens
effectivement le message "...impossibilité de mettre à jour..."

Quelle serait alors la meilleure stratégie à adopter ?

Merci

"Philippe T [MS]" a écrit :

Bonjour,

Comme d'habitude, entièrement d'accord avec Fred !!! :-)

Il est très rare d'être obligé de forcer des verrous alors que le moteur
sais si bien les gérer lui même !!! :-)

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"Fred BROUARD" wrote in message
news:%
>
>
> carjo12 a écrit:
>> Merci beaucoup pour les informations et les liens. Toutefois,
>> pourriez-vous me préciser certains points que vous avez mentionnés, svp?
>>
>> Les clients sont connectés en SQL. La MAJ est très simple et standard,
>> sans curseur, du genre:
>>
>> Update T1
>> Set champ1 = @ch1
>> From T1
>> Where T1.id = @id
>>
>> 1 - Qu'entendez-vous par "client déconnecté"? Si les MAJ se font
>> successivement, alors il n'y a pas de problèmes de concurrence ?
>
> aucun
>
>>
>> 2 - Si j'ai bien compris votre message, avec la façon décrite plus haut
>> de faire le Update, a - SQL posera des verrous pessimistes, et le succès
>> de la transaction sera assuré
>> b - Il est préférable de ne pas "personnaliser" l'implémentation de
>> verrous dans la BD...
>
> Jamais de verouillage explicite
>
>>
>> Merci de vos précisions.
>>
>> "Fred BROUARD" a écrit :
>>
>>
>>>Tout dépend de la façons dont cette MAJ est faites.
>>>
>>>Si c'est à travers un curseur (par exemple en client connecté tel que VB,
>>>Delphi, C++, C#...) alors l'un des deux sera rejeté (verrous optimiste)
>>>avec un message du genre : la version de la ligne considérée à changée,
>>>impossiblme de mettre à jour.
>>>
>>>Si client déconnecté alors les 2 maj se feront successivement.
>>>
>>>Ne jamais utiliser directement les verrous, c'est comme cela que l'on tue
>>>une base de données.
>>>
>>>Lire sur les transactions en général :
>>>http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1
>>>
>>>Sur les verrous SQL Server et les transactions SQL Server :
>>>http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L4.5
>>>
>>>A +
>>>
>>>--
>>>Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
>>>Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
>>>Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
>>>************************ www.datasapiens.com *************************
>>>
>>>
>>>carjo12 a écrit:
>>>
>>>>Dans ce cas, qu'est-ce qui arrive si 2 personnes effectuent une mise à
>>>>jour en même temps, sur la même ligne?
>>>>
>>>>Merci.
>>>>
>>>>"Philippe T [MS]" a écrit :
>>>>
>>>>
>>>>
>>>>>Bonjour,
>>>>>
>>>>>Pourquoi ne pas simplement gérer des transactions et laisser SQL gérés
>>>>>ses verrous ?
>>>>>
>>>>>Lors d'un INSERT, pas besoin de verrous.
>>>>>
>>>>>----------------------------------------------------------------------
>>>>>Philippe TROTIN - Microsoft Service France
>>>>>
>>>>>"carjo12" wrote in message
>>>>>news:
>>>>>
>>>>>
>>>>>>Bonjour
>>>>>>
>>>>>>Je dois implémenter des verrous dans ma base de données. J'ai lu la
>>>>>>documentation SQL sur le sujet, et comme elle offre beaucoup de
>>>>>>possibilités
>>>>>>et qu'une telle action s'avère délicate, j'aimerais vous soumettre un
>>>>>>scénario simplifié d'implémentation de verrous afin d'avoir votre
>>>>>>avis.
>>>>>>
>>>>>>Contexte :
>>>>>>
>>>>>>La base de données contient 3 tables (T1, T2 et T3) dont le schéma est
>>>>>>organisé en « flocon ».
>>>>>>Trois clients requièrent des ressources, soit pour faire une mise à
>>>>>>jour,
>>>>>>soit pour lire les données.
>>>>>>Quotidiennement et à heure fixe, une synchronisation est faite sur
>>>>>>l'ensemble des tables.
>>>>>>
>>>>>>Voici des actions simultanées possibles :
>>>>>>
>>>>>>Action #1 - Client #1:
>>>>>>
>>>>>>Update T1 WITH (UPDLOCK)
>>>>>>Set champ1 = @ch1
>>>>>
>>>>>>From T1
>>>>>
>>>>>>Where T1.id = @id
>>>>>>
>>>>>>Update T2 WITH (UPDLOCK)..idem
>>>>>>Update T3 WITH (UPDLOCK). idem
>>>>>>
>>>>>>Action #2 - Client #2:
>>>>>>
>>>>>>Update T1 WITH (UPDLOCK). idem
>>>>>>Update T2 WITH (UPDLOCK). idem
>>>>>>Update T3 WITH (UPDLOCK). idem
>>>>>>
>>>>>>Action #3 - Client #3 :
>>>>>>
>>>>>>Select * from T1, T2, T3 WITH (READPAST | NOLOCK)
>>>>>>
>>>>>>Action #4 - Synchronisation automatique des nouvelles données :
>>>>>>
>>>>>>Insert into T1 values ..
>>>>>>Insert into T2 values ..
>>>>>>Insert into T3 values ..
>>>>>>
>>>>>>1-Serait-ce un scénario envisageable? Quelles pourraient être les
>>>>>>problèmes
>>>>>>d'un tel contexte?
>>>>>>
>>>>>>2-Doit-on utiliser le type de verrou READPAST ou NOLOCK lors de la
>>>>>>lecture
>>>>>>dans ce contexte?
>>>>>>
>>>>>>3-Doit-on mettre un verrou lors des transactions d'insertion?
>>>>>>
>>>>>>Merci à l'avance pour votre aide.
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>
>
> --
> Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
> Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
> Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
> ************************ www.datasapiens.com *************************
>