Aller au contenu principal

7. Write Lock (Verrou d'écriture)

Cette section décrit le verrou d'écriture (Write Lock), le seul type de verrou défini dans cette spécification. Un verrou d'écriture est un verrou qui accorde au propriétaire du verrou le droit de modifier la ressource. Le propriétaire du verrou est le principal qui a créé le verrou.

7.1 Write Locks and Properties (Verrous d'écriture et propriétés)

Bien que ceux qui n'ont pas de verrou d'écriture ne puissent pas modifier le contenu d'une ressource, ils peuvent (MAY) modifier les propriétés mortes de la ressource. Cela permet, par exemple, à un principal d'ajouter des commentaires à une ressource verrouillée sans avoir besoin d'un accès en écriture.

Les propriétés vivantes ont généralement une sémantique imposée par le serveur. Le serveur a donc le pouvoir discrétionnaire de déterminer si et comment autoriser les modifications des propriétés vivantes lorsqu'une ressource est verrouillée. Par exemple, un serveur peut (MAY) autoriser la modification des propriétés vivantes même lorsqu'une ressource est verrouillée.

7.2 Avoiding Lost Updates (Éviter les mises à jour perdues)

Le but des verrous d'écriture est d'empêcher les mises à jour perdues. Une mise à jour perdue se produit lorsque plusieurs principaux tentent de modifier une ressource sans coordination, ce qui entraîne l'écrasement des modifications d'un ou plusieurs principaux par des mises à jour ultérieures.

Les verrous d'écriture fournissent un mécanisme de sérialisation : seul le détenteur du verrou peut modifier la ressource verrouillée. Cela empêche le problème de mise à jour perdue en garantissant que les modifications se produisent séquentiellement plutôt que simultanément.

Exemple de scénario de mise à jour perdue (sans verrouillage) :

  1. L'utilisateur A récupère la version 1 de la ressource
  2. L'utilisateur B récupère la version 1 de la ressource
  3. L'utilisateur A modifie et enregistre → crée la version 2
  4. L'utilisateur B modifie (basé sur la version 1) et enregistre → crée la version 3, écrasant les modifications de A

Avec verrou d'écriture :

  1. L'utilisateur A verrouille la ressource
  2. L'utilisateur B tente de modifier → reçoit une erreur 423 Locked
  3. L'utilisateur A modifie et déverrouille
  4. L'utilisateur B peut maintenant verrouiller et modifier

7.3 Write Locks and Unmapped URLs (Verrous d'écriture et URLs non mappées)

Une requête LOCK réussie sur une URL non mappée crée une ressource vide qui est verrouillée. Ce mécanisme permet aux clients de réserver une URL avant que le contenu de la ressource ne soit créé.

Lorsqu'une ressource vide verrouillée est créée :

  • La ressource n'a pas de contenu (entité de longueur zéro)
  • La ressource est verrouillée avec le verrou spécifié
  • Un PUT ou MKCOL ultérieur peut ajouter du contenu à la ressource
  • Le jeton de verrou doit être soumis avec la requête PUT ou MKCOL

Ce mécanisme de « ressource lock-null » est décrit en détail dans l'Annexe D.

7.4 Write Locks and Collections (Verrous d'écriture et collections)

Un verrou d'écriture sur une collection verrouille la ressource de collection elle-même, empêchant les modifications de l'appartenance de la collection (ajout ou suppression de membres internes).

Lorsqu'un verrou de profondeur infinie est appliqué à une collection :

  • La collection elle-même est verrouillée
  • Tous les membres internes sont verrouillés
  • Toutes les ressources descendantes sont verrouillées récursivement
  • Les nouveaux membres ajoutés à la collection sont automatiquement verrouillés

Héritage du verrou : Lorsqu'une nouvelle ressource est ajoutée à une collection verrouillée (avec profondeur infinie), la nouvelle ressource hérite du verrou de la collection parente.

7.5 Write Locks and the If Request Header (Verrous d'écriture et l'en-tête de requête If)

Les clients soumettent des jetons de verrou en utilisant l'en-tête de requête If. Cet en-tête permet l'exécution conditionnelle de méthodes basée sur la présence de jetons de verrou.

La syntaxe de l'en-tête If prend en charge :

  • Des jetons de verrou uniques
  • Plusieurs jetons de verrou (pour plusieurs verrous)
  • Des listes étiquetées (associant des jetons à des URLs spécifiques)
  • Des conditions NOT (exigeant l'absence de verrous)

7.5.1 Example - Write Lock and COPY (Exemple - Verrou d'écriture et COPY)

COPY /source HTTP/1.1
Host: example.com
Destination: http://example.com/destination
If: `http://example.com/destination` (<opaquelocktoken:token123>)

Cette requête copie /source vers /destination, mais seulement si le client détient le jeton de verrou pour /destination.

7.5.2 Example - Deleting a Member of a Locked Collection (Exemple - Suppression d'un membre d'une collection verrouillée)

DELETE /folder/file.txt HTTP/1.1
Host: example.com
If: `http://example.com/folder/` (<opaquelocktoken:folder-token>)

Pour supprimer un membre d'une collection verrouillée, le client doit soumettre le jeton de verrou pour la collection.

7.6 Write Locks and COPY/MOVE (Verrous d'écriture et COPY/MOVE)

La méthode COPY crée une nouvelle ressource à la destination. La nouvelle ressource n'est PAS automatiquement verrouillée, même si la source était verrouillée. Les verrous ne sont pas copiés.

La méthode MOVE est sémantiquement équivalente à COPY suivi de DELETE. Le verrou sur la source est supprimé lorsque la ressource est déplacée. La destination n'est pas automatiquement verrouillée.

Si la destination d'un COPY ou MOVE est verrouillée, le client doit soumettre le jeton de verrou approprié pour écraser la destination.

7.7 Refreshing Write Locks (Rafraîchissement des verrous d'écriture)

Les verrous ont des durées de vie finies. Pour empêcher l'expiration prématurée du verrou, les clients peuvent rafraîchir les verrous en soumettant une requête LOCK avec :

  • Le même jeton de verrou dans l'en-tête If
  • Aucun corps de requête (ou un élément lockinfo vide)

Le serveur répond avec la nouvelle valeur de délai d'expiration. Le rafraîchissement du verrou permet des sessions d'édition à long terme sans expiration du verrou.

Exemple de rafraîchissement de verrou :

LOCK /resource HTTP/1.1
Host: example.com
If: (<opaquelocktoken:token123>)
Timeout: Second-3600

Le serveur prolonge le délai d'expiration du verrou et retourne la nouvelle heure d'expiration.