php & mysql: problemi di concorrenza?

Salve a tutti!

Io sono un nuovo iscritto ed un nuovo sviluppatore in php. Ho comunque un po' di esperienze con altri linguaggi di programmazione ma poca specificatamente con php e le webApps.

Il mio dubbio e' questo:

come si puo' gestire in maniera efficace il problema della concorrenza in php 4.x?

Cerco di spegarmi, supponiamo che io abbia una tabella x e un modulo php che legga il contenuto di questa tabella verifichi la presenza di un dato record e se necessario lo aggiunga.

Come posso essere certo che tra la lettura e la scrittura nessuna altra istanza del modulo o altri vada a scrivere sulla suddetta tabella alterandola?

Ogni indizio o suggerimento è ovviamente prezioso!

Grazie in anticipo!

thorf

inviato 11 anni fa
thorfinn
X 0 X

Ciao thorfinn e benvenuto,

il tuo problema è comunissimo e può essere risolto in diversi modi.

Il metodo principe è basato sulle transazioni e viene supportato dalla maggior parte dei database. Una transazione è  un insieme di query che il database si impegna ad eseguire in modo completamente indipendente dal resto. Questo insieme di query gode di diverse proprietà che, tra l'altro, permettono di non avere problemi di concorrenza.

Per i dettagli sulle transazioni in MySQL vedi qui:

http://dev.mysql.com/doc/mysql/en/transactional-commands.html

Un altro metodo è usare i LOCK ovvero impedire agli altri thread (script) di accedere a determinate tabelle. Tali script attenderanno lo sbloccaggio delle tabelle in questione, operazione che avviene attraverso un UNLOCK.

Per tutte le informazioni sui lock vedi qui:

http://dev.mysql.com/doc/mysql/en/lock-tables.html

In tutti e due i casi si tratta di inviare delle ulteriori query all'inizio ed alla fine dell'interazione con una tabella in modo da ottenerne l'accesso esclusivo.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

grazie mille per la disponibilità e per la velocità!

Ho letto i documenti a cui mi hai mandato e ho trovato anche altre fonti interessanti.

All'indirizzo:

http://www.samspublishing.com/articles/article.asp?p=30875&seqNum=7&rl=1

e' presente un altro articolo interessante a riguardo. In ogni caso essendo il mio db basato su tabelle di tipo myIsam credo che, alla luce del fatto che le mie operazioni (lettura e poi scrittura) non necessitano di particolari controlli rispetto alla consistenza del db prima e dopo le operazioni, il metodo migliore in questo caso sia di usare delle lock (che se non sbaglio poi vengono comunque rilasciate alla chiusura della connessione e quindi nel mio caso alla fine dello script non essendo la connessione persistente, mettendomi al riparo da eventuali crash o impreviste disconnessioni del client).

Questo pero' mi porta a fare delle considerazioni che prima, ingenuamente, non avevo affrontato. Ovvero il tipo di tabelle usate ovvero myIsam(non transactional) vs InnoDb(transactional). Ecco questo e' un argomento che meriterebbe di essere affrontato con cura al piu' presto!!

Grazie ancora!!

thorf

risposto 11 anni fa
thorfinn
X 0 X

Quando avrai bisogno delle foreign key o delle transazioni, e non solo per evitare conflitti di accesso, allora dovrai usare le InnoDB. In caso contrario continua ad usare le MyISAM. Garantiscono prestazioni migliori.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda