Passa al contenuto principale

7. Write Lock (Blocco di Scrittura)

Questa sezione descrive il blocco di scrittura (Write Lock), l'unico tipo di blocco definito in questa specifica. Un blocco di scrittura è un blocco che concede al proprietario del blocco il diritto di modificare la risorsa. Il proprietario del blocco è il principale che ha creato il blocco.

7.1 Write Locks and Properties (Blocchi di scrittura e proprietà)

Sebbene coloro che non hanno un blocco di scrittura non possano modificare il contenuto di una risorsa, possono (MAY) modificare le proprietà dead della risorsa. Ciò consente, ad esempio, a un principale di aggiungere commenti a una risorsa bloccata senza necessitare di accesso in scrittura.

Le proprietà live hanno tipicamente una semantica imposta dal server. Il server ha quindi discrezionalità su se e come consentire modifiche alle proprietà live quando una risorsa è bloccata. Ad esempio, un server può (MAY) consentire la modifica delle proprietà live anche quando una risorsa è bloccata.

7.2 Avoiding Lost Updates (Evitare aggiornamenti persi)

Lo scopo dei blocchi di scrittura è prevenire gli aggiornamenti persi. Un aggiornamento perso si verifica quando più principali tentano di modificare una risorsa senza coordinamento, risultando in una o più modifiche dei principali sovrascritte da aggiornamenti successivi.

I blocchi di scrittura forniscono un meccanismo di serializzazione: solo il detentore del blocco può modificare la risorsa bloccata. Ciò previene il problema dell'aggiornamento perso garantendo che le modifiche avvengano sequenzialmente piuttosto che contemporaneamente.

Esempio di scenario di aggiornamento perso (senza blocco):

  1. L'utente A recupera la versione 1 della risorsa
  2. L'utente B recupera la versione 1 della risorsa
  3. L'utente A modifica e salva → crea la versione 2
  4. L'utente B modifica (basandosi sulla versione 1) e salva → crea la versione 3, sovrascrivendo le modifiche di A

Con blocco di scrittura:

  1. L'utente A blocca la risorsa
  2. L'utente B tenta di modificare → riceve un errore 423 Locked
  3. L'utente A modifica e sblocca
  4. L'utente B può ora bloccare e modificare

7.3 Write Locks and Unmapped URLs (Blocchi di scrittura e URL non mappati)

Una richiesta LOCK riuscita su un URL non mappato crea una risorsa vuota che è bloccata. Questo meccanismo consente ai client di riservare un URL prima che il contenuto della risorsa venga creato.

Quando viene creata una risorsa vuota bloccata:

  • La risorsa non ha contenuto (entità di lunghezza zero)
  • La risorsa è bloccata con il blocco specificato
  • Un successivo PUT o MKCOL può aggiungere contenuto alla risorsa
  • Il token di blocco deve essere inviato con la richiesta PUT o MKCOL

Questo meccanismo di "risorsa lock-null" è descritto in dettaglio nell'Appendice D.

7.4 Write Locks and Collections (Blocchi di scrittura e raccolte)

Un blocco di scrittura su una raccolta blocca la risorsa raccolta stessa, impedendo modifiche all'appartenenza della raccolta (aggiunta o rimozione di membri interni).

Quando un blocco di profondità infinita viene applicato a una raccolta:

  • La raccolta stessa è bloccata
  • Tutti i membri interni sono bloccati
  • Tutte le risorse discendenti sono bloccate ricorsivamente
  • I nuovi membri aggiunti alla raccolta sono automaticamente bloccati

Ereditarietà del blocco: Quando una nuova risorsa viene aggiunta a una raccolta bloccata (con profondità infinita), la nuova risorsa eredita il blocco dalla raccolta genitore.

7.5 Write Locks and the If Request Header (Blocchi di scrittura e l'header di richiesta If)

I client inviano token di blocco utilizzando l'header di richiesta If. Questo header consente l'esecuzione condizionale di metodi basata sulla presenza di token di blocco.

La sintassi dell'header If supporta:

  • Token di blocco singoli
  • Token di blocco multipli (per blocchi multipli)
  • Liste taggate (associando token a URL specifici)
  • Condizioni NOT (richiedendo l'assenza di blocchi)

7.5.1 Example - Write Lock and COPY (Esempio - Blocco di scrittura e COPY)

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

Questa richiesta copia /source in /destination, ma solo se il client detiene il token di blocco per /destination.

7.5.2 Example - Deleting a Member of a Locked Collection (Esempio - Eliminazione di un membro di una raccolta bloccata)

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

Per eliminare un membro di una raccolta bloccata, il client deve inviare il token di blocco per la raccolta.

7.6 Write Locks and COPY/MOVE (Blocchi di scrittura e COPY/MOVE)

Il metodo COPY crea una nuova risorsa alla destinazione. La nuova risorsa NON è automaticamente bloccata, anche se la sorgente era bloccata. I blocchi non sono copiati.

Il metodo MOVE è semanticamente equivalente a COPY seguito da DELETE. Il blocco sulla sorgente viene rimosso quando la risorsa viene spostata. La destinazione non è automaticamente bloccata.

Se la destinazione di un COPY o MOVE è bloccata, il client deve inviare il token di blocco appropriato per sovrascrivere la destinazione.

7.7 Refreshing Write Locks (Aggiornamento dei blocchi di scrittura)

I blocchi hanno durate di vita finite. Per prevenire la scadenza prematura del blocco, i client possono aggiornare i blocchi inviando una richiesta LOCK con:

  • Lo stesso token di blocco nell'header If
  • Nessun corpo della richiesta (o un elemento lockinfo vuoto)

Il server risponde con il nuovo valore di timeout. L'aggiornamento del blocco consente sessioni di modifica a lungo termine senza scadenza del blocco.

Esempio di aggiornamento del blocco:

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

Il server estende il timeout del blocco e restituisce il nuovo tempo di scadenza.