2011-04-28 18 views
9

Ci sono due tavoli:MySQL Query contiene sub-query atomic?

Tabella 1 Unico Sessions

ID Count 

Tabella 2 (Sessions)

ID Name 

vorrei aggiornare count solo se name non esiste in sessioni per contare sessioni uniche, questo è un esempio così l'obiettivo non è farlo in modo alternativo, ma que stion è:

Rowsaffected = Update table1 
        set Count = Count + 1 
       where (Select count(*) from table2 where Name = 'user1') = 0; 

Insert into table2 (NAME) values('user'); 

La prima query è una query atomica? Se sì, allora non c'è problema.

Se no, allora Cosa succede se ci sono più thread in esecuzione per eseguire le operazioni sopra menzionate? È possibile che:

Thread 1: conteggi restituisce 0, ha aggiornato la tabella 1 ma non la tabella 2 prima dell'avvio del thread 2. Thread 2: trova il conteggio 0, aggiornerà anche il conteggio.

Ora per lo stesso utente, il conteggio è 2 che non dovrebbe accadere.

Qualsiasi suggerimento/feedback.

risposta

1

Dipende dal motore di archiviazione che si sta utilizzando.

Il vostro esempio funziona correttamente solo con i motori di MySQL che supportano le transazioni, come InnoDB come si implementa in modo corretto la gestione delle transazioni (e la coerenza a livello di istruzione leggere)

MyISAM non supporta le transazioni.

+1

@Johan: quale altro motore in MySQL supporta le transazioni? Non sono a conoscenza di altri rispetto a InnoDB –

+0

E.g. NDBCluster, BDB – Johan

+0

Sto usando InnodDB, quindi intendi che la prima query è di natura atomica, vale a dire fino a quando la query non viene completata, nessun altro sarà in grado di leggere quella tabella? – Navin