paolo@bimodesign.com | +34 608 61 64 10

Framework

        

Yii e la gestione del lock MySQL

In questo articolo vi illustro come implementare il lock MySQL, in Write Mode su una o piu' tabelle, usando i costrutti tipici del framework Yii.
Prima di procedere un breve accenno al LOCK in MySQL, per i cui approfondimenti rimando a questo link.
In MySQL il lock chiamato explicitly viene richiamato dal client e puo' essere eseguito a livello di tabella (nei casi di Storage Engine di tipo MyISAM, MEMORY e MERGE) o di Riga/Row (nel caso di InnoDB) o di page (BDB). Nel caso MyISAM, non c'e' limite al numero delle tabelle su cui puo' essere eseguito il lock, pero' va ricordato che dovra' essere utilizzato un solo comando (LOCK) che le includa tutte e quindi il comando UNLOCK le liberera' di conseguenza tutte insieme.
Abbiamo 4 tipi di Lock, che vado a dettagliare schematicamente:

READ: Non permette di eseguire nessuna operazione di INSERT/UPDATE/DELETE
WRITE: Non permette di eseguire ne' l'operazione di SELECT ne' di WRITE. Puo' essere acquisito solo quando la tabella/riga non e' in uso.
READ LOCAL (Solo per MyISAM): Se una tabella NON presenta deframmentazione (hole), il client che genera il LOCK permette di scrivere a partire dal punto in cui e' stato eseguito il LOCK, riservandosi quindi per se le rows fino a quel punto.
LOW PRIORITY WRITE: i cui dettagli non interessano in questo ambito.

Premesso cio', passiamo ad analizzare come implementare il Lock di tipo Write su tabelle MyISAM.
Schematicamente, bisogna considerare che

1) La chiamata per il LOCK

(se 1 tabella) Yii::app()->db->createCommand("LOCK TABLES tabella1 WRITE")->execute();
(se 2 tabla) Yii::app()->db->createCommand("LOCK TABLES tabella1 WRITE, tabella2 WRITE")->execute(); 


2) La chiamata per UNLOCK

Yii::app()->db->createCommand("UNLOCK TABLES")->execute();


3) Limitazioni
Tra il punto 1) e 2) no si possono eseguire alcun tipo di operazioni che non includano le tabelle su cui influisce il LOCK. Quindi, se necessario, queste tabelle vanno incluse nel lock
Tra il punto 1) e 2) non si puo' usuare l'istruzione

MDeal::model()->findAll

o simili, perche' Yii assegna automaticamente gli alias a le tabelle e questi ultimi non si possono aggiungere al LOCK ne', chiaramente, si puo' aggiungere il nome della tabella. Quindi va usata una maniera differente di eseguire il select.