2011-01-28 8 views
18

Attualmente sto facendo funzionare un database MySQL. Tutte le mie tabelle utilizzano il motore di tabella InnoDB.Concorrenza MySQL, come funziona e ho bisogno di gestirlo nella mia applicazione

Chiunque accede alla mia applicazione può visualizzare i record e sono preoccupato che a un certo punto due utenti possano aggiornare o inserire un record contemporaneamente. MySQL gestisce questo tipo di problema di concorrenza con garbo, o è qualcosa che dovrò programmare nel mio codice?

Se devo programmarlo nel mio codice come si fa a gestire un caso di concorrenza come questo?

+0

Non è necessario preoccuparsi di questi. I database del giorno moderno sono abbastanza intelligenti nel controllo della concorrenza :) – Tauquir

+0

questo è quello che ho pensato di volere semplicemente ricontrollare – medium

risposta

20

Le istruzioni SQL sono atomiche. Cioè, se si esegue qualcosa di simile:

UPDATE Cars SET Sold = Sold + 1 

nessuno può cambiare la variabile Sold durante questa informativa. Viene sempre incrementato di 1, anche se qualcun altro sta eseguendo contemporaneamente la stessa istruzione.

Il problema si verifica se si dispone di affermazioni che dipendono l'uno dall'altro:

a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 

Tra queste query, un altro utente può modificare la tabella di auto e aggiornamento venduti. Per evitare questo, avvolgerlo in una transazione:

BEGIN; 
a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 
COMMIT; 

Le operazioni sono supportate da InnoDB, ma non da MyISAM.

+2

grazie per questa spiegazione. – medium

+2

Anche in una transazione non c'è garanzia. MySQL per impostazione predefinita, blocca a livello di riga/blocco tabella solo per le operazioni di scrittura, anche nelle transazioni. Per rendere ** a ** avere un valore corretto, è necessario inserire * FOR UPDATE * in SELECT, o per specificare un * livello di isolamento * più alto * su TRANSACTION come * SERIALIZABLE *. ** Ulteriori informazioni: ** [Blocco interno] (https://dev.mysql.com/doc/refman/5.6/en/internal-locking.html), [Livelli di isolamento] (https: //dev.mysql .com/doc/refman/5.6/it/innodb-transaction-isolation-levels.html), [Locking Reads] (https://dev.mysql.com/doc/refman/5.6/en/innodb-locking- reads.html) –

Problemi correlati