Ritorna alla lezione |
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.
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.
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.