Mauricio Cabral
a- a+

Blocco delle tabelle - Lock in MySQL

In questo capitolo tratteremo i blocchi delle tabelle, chenon sono un elemento da trascurare, sono importanti se nonessenziali per il corretto funzionamento delle nostreapplicazioni.

Per capire meglio l'importanza dei blocchi il nostroprogetto d'esempio ci viene in aiuto. Supponiamo chenella nostra libreria virtuale ci siano due utenti cheacquisteranno dei libri. Nel magazzino ci sono 2 copie dellibro "HTML 4.01" , il primo utente (A) e ilsecondo l'utente (B) decidono di acquistare lo stessolibro (però)... Quando l'utente A procedeall'acquisto di "HTML 4.01" l'applicazionecontrolla se la quantità del magazzino èmaggiore o uguale a quello dell'ordine dell'utente,se dal controllo risulta una corretta quantità diprodotti l'applicazione procede ad aggiornare ildatabase. L'utente (A) acquista una copia del librolasciando nel magazzino una copia soltanto. Nello stessoinstante l'utente (B) decide di acquistare due copiedello stesso libro, l'applicazione controlla laquantità del prodotto (che risulta corretta) e procedead aggiornare il database. E qui avviene l'errore,l’utente (A) acquista correttamente il libro mentrel'utente (B) acquista 2 copie mentre nel database (e nelmagazzino) c'è sono soltanto una.

Potete anche pensare che sia una situazione quasiimpossibile, 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ù complessapotette perdere la sincronizzazione dell'intero database.

MySQL non può bloccare solo un Record o un set diRecord 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/etabella/e.
Il blocco WRITE blocca la tabella/e in lettura e scrittura.

Il blocco delle tabelle non è immediato, una voltarichiesto il blocco, il database provvede a mettere larichiesta in coda. Se non ci sono altri blocchi in esecuzionesi procede al blocco, ma con alcune regole:

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

Si possono aggirare queste regole assegnando delleproprietà ai blocchi:

se in un blocco WRITE si dichiara LOW_PRIORITY WRITE si da lapriorità ai blocchi READ
(fatte attenzione quando utilizzate questo tipo diproprietà, in una applicazione i blocchi READnormalmente sono più numerosi rispetto ai blocchiWRITE, quindi usando questa proprietà il blocco WRITEdovrà attendere che finiscano i blocchi READ per poteraggiornare la tabella)

se in una SELECT viene dichiarata SELECT HIGH_PRIORITY questaha la priorità sui blocchi WRITE, quindi vieneeseguita anche se ci sono blocchi WRITE.