Mauricio Cabral
a- a+

Blocco delle tabelle - Lock in MySQL

In questo capitolo tratteremo i blocchi delle tabelle, che non sono un elemento da trascurare, sono importanti se non essenziali per il corretto funzionamento delle nostre applicazioni.

Per capire meglio l'importanza dei blocchi il nostro progetto d'esempio ci viene in aiuto. Supponiamo che nella nostra libreria virtuale ci siano due utenti che acquisteranno dei libri. Nel magazzino ci sono 2 copie del libro "HTML 4.01" , il primo utente (A) e il secondo l'utente (B) decidono di acquistare lo stesso libro (però)... Quando l'utente A procede all'acquisto di "HTML 4.01" l'applicazione controlla se la quantità del magazzino è maggiore o uguale a quello dell'ordine dell'utente, se dal controllo risulta una corretta quantità di prodotti l'applicazione procede ad aggiornare il database. L'utente (A) acquista una copia del libro lasciando nel magazzino una copia soltanto. Nello stesso instante l'utente (B) decide di acquistare due copie dello stesso libro, l'applicazione controlla la quantità del prodotto (che risulta corretta) e procede ad aggiornare il database. E qui avviene l'errore, l’utente (A) acquista correttamente il libro mentre l'utente (B) acquista 2 copie mentre nel database (e nel magazzino) c'è sono soltanto una.

Potete anche pensare che sia una situazione quasi impossibile, ma in un sito molto affollato non lo è affatto e poi è un rischio che non potete permettervi, poi questo è solo un esempio "non critico" se la vostra applicazione è più complessa potette perdere la sincronizzazione dell'intero database.

MySQL non può bloccare solo un Record o un set di Record ma soltanto l'intera tabella.

 

Per bloccare una tabella si procede cosi:

LOCK TABLES Catalogo WRITE 

o

LOCK TABLES Catalogo READ

 

Per sbloccare le tutte le tabelle:

UNLOCK TABLES

Si possono bloccare più tabelle contemporaneamente:

LOCK TABLES Catalogo WRITE, Autore WRITE, Nome READ

 

READ & WRITE

Si possono bloccare le tabelle in modo diverso:

Il blocco READ permette soltanto la lettura della/e tabella/e.
Il blocco WRITE blocca la tabella/e in lettura e scrittura.

Il blocco delle tabelle non è immediato, una volta richiesto il blocco, il database provvede a mettere la richiesta in coda. Se non ci sono altri blocchi in esecuzione si procede al blocco, ma con alcune regole:

se non ci sono blocchi il blocco viene concesso caso contrario vengono inseriti in coda
i blocchi WRITE hanno precedenza sui blocchi READ
i blocchi READ vengono eseguiti solo quando non ci sono più blocchi WRITE in coda

Si possono aggirare queste regole assegnando delle proprietà ai blocchi:

se in un blocco WRITE si dichiara LOW_PRIORITY WRITE si da la priorità ai blocchi READ
(fatte attenzione quando utilizzate questo tipo di proprietà, in una applicazione i blocchi READ normalmente sono più numerosi rispetto ai blocchi WRITE, quindi usando questa proprietà il blocco WRITE dovrà attendere che finiscano i blocchi READ per poter aggiornare la tabella)

se in una SELECT viene dichiarata SELECT HIGH_PRIORITY questa ha la priorità sui blocchi WRITE, quindi viene eseguita anche se ci sono blocchi WRITE.



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Staff
Ti interessano altri articoli su questo argomento?
Chiedi alla nostra Redazione!