Locking delle tabelle in MySQL

23 dicembre 2008

Quando procedere al locking delle tabelle

Innanzitutto è importante sottolineare il fatto che le applicazioni che prevedono semplici operazioni di inserimento, cancellazione o modifica di un record e che non utilizzano risultati prodotti da precedenti queries di interrogazione non necessitano di procedure di locking a supporto.

In generale è possibile dire che il locking è richiesto soltanto nei casi in cui un’applicazione è stata concepita in modo da operare una lettura dei dati da una tabella per poi scrivere questi valori sul database. Il locking di una tabella è per esempio necessario quando vengono lanciate istruzioni tra di loro interdipendenti, una situazione in cui modifiche sugli stessi dati effettuate da altri utilizzatori pregiudicherebbero l’integrità dei risultati (concorrenza), come nel caso in cui un’istruzione SELECT precede un comando di aggiornamento o di cancellazione.

Un esempio classico di concorrenza nell’uso delle tabelle da parte di utenze multiple è quello delle applicazioni utilizzate a supporto dei sistemi di prenotazione: due agenzie di viaggio o due portali dedicati al booking online non dovrebbero consentire a due utenti differenti di prenotare la stessa stanza d’albergo nello stesso momento.

Le procedure di locking sono quindi fondamentali nelle operazioni di prevenzione della concorrenza. Istruzioni che prevedono l’utilizzo di comandi come SELECT, UPDATE, INSERT o DELETE possono essere impedite grazie al ricorso alle variabili Lock; se su una tabella sussiste un vincolo in scrittura questa non risponderà a interrogazioni, non consentirà cancellazioni, aggiornamenti o inserimenti nè permetterà la definizione di ulteriori blocchi.

In generale, è possibile elencare quattro regole fondamentali alla base dell’utilizzo del locking a carico delle tabelle:

  1. un utilizzatore può rilasciare tutti i blocchi definiti al termine di una transazione;
  2. nel caso in cui un utilizzatore necessiti di definire un blocco, questo dovrà essere impostato su tutte le tabelle coinvolte in una transazione;
  3. nel caso in cui un utilizzatore desideri scrivere dati all’interno di una tabella e questa sia coinvolta in una transazione a rischio di concorrenza, dovrà essere impostato un blocco in scrittura;
  4. nel caso in cui un utilizzatore desideri accedere ad una tabella per la lettura dei dati contenuti in essa e questa sia coinvolta in una transazione a rischio di concorrenza, dovrà essere impostato un blocco in lettura.

In pratica le regole elencate spiegano che, quando si desidera scrivere su una tabella, è buona norma che nessun altro utilizzatore possa accedere ai dati prima che questi vengano modificati; nello stesso modo, se si desidera leggere il contenuto di una tabella è bene che nessuno apporti nello stesso tempo delle modifiche.

Nel caso in cui si desideri effettuare delle operazioni di inserimento e di selezione su una determinata tabella in una situazione in cui, grazie all’utilizzo del locking, non siano accettabili istruzioni concorrenti, sarà possibile ricorrere all’impiego delle tabelle temporanee come nell’esempio seguente:

mysql> LOCK TABLES tabella WRITE, tabella_temporanea WRITE;
mysql> INSERT INTO tabella SELECT * FROM tabella_temporanea;
mysql> DELETE FROM tabella_temporanea;
mysql> UNLOCK TABLES;

I passi da seguire sono quindi molto semplici:

  1. impostare il blocco tramite il comando LOCK seguito dall’argomento WRITE per entrambe le tabelle;
  2. effettuare l’istruzione d’inserimento nella tabella “fisica” recuperando i dati dalla tabella temporanea tramite un’istruzione SELECT;
  3. cancellare la tabella temporanea ormai inutile;
  4. sbloccare la tabella rimuovendo i vincoli con il comando UNLOCK TABLES.
Se vuoi aggiornamenti su Locking delle tabelle in MySQL inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Locking delle tabelle in MySQL

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy