Ritorna alla lezione

Laboratorio di Sistemi Informativi - Esercizi

Concorrenza nelle applicazioni web

Esercizio 1

Sia data la tabella contatore, creata e inzializzata con i seguenti comandi:
create table contatore (
  val int
);

insert into contatore values (0);
e lo script conteggia.php che aggiunge un numero specificato dall'utente al valore corrente del contatore. Verificare che lo script può generare dei risultati errati quando ne vengono eseguite più copie concorrenti. Modificare lo script in modo che non si verifichino problemi nel caso di più esecuzioni concorrenti, sia modificando le query opportunamente, sia ricorrendo ai blocchi di tabella.

Soluzione

Lasciamo la verifica al lettore e occupiamoci di modificare il programma per evitare problemi generati dall'esecuzione concorrente.

La prima soluzione prevede la modifica delle query SQL, rimpiazzando la SELECT e la UPDATE con una unica UPDATE che fa il lavoro di entrambe:

UPDATE contatore SET val=val+?

dove il parametro ? viene poi impostato all'incremento da applicare. Si ottiene il file conteggia-onlyupdate.php. Modificato in questo modo, anche senza blocchi di tabella, lo script non ha più alcun problema, in quanto la operazione di UPDATE è una operazione atomica.

L'altra soluzione consiste nel racchiudere le due query SQL (la SELECT per recuperare il valore corrente del contatore e la UPDATE per modificarlo) tra i comando LOCK TABLES e UNLOCK TABLES. Si ottiene il file conteggia-lock1.php.

Esercizio 2

Risolvere l'esercizio 1 usando gli advisory lock invece dei mandatory lock.

Soluzione

La soluzione è simile a quella dell'esercizio precedente, ma usando SELECT GET_LOCK() e SELECT RELEASE_LOCK invece dei comandi LOCK TABLES e UNLOCK TABLES. In più viene trattato il caso in cui la GET_LOCK fallisce, presumibilmente per un congestionamento del sistema, visualizzando un opportuno messaggio di errore. Si ottiene il file conteggia-lock2.php.

Valid HTML 4.01 Transitional Valid CSS!