2013-02-22 12 views
5

Ero curioso di sapere come si comportano gli script PHP e MySQL? Lo script è fondamentalmente composto da due query SQL.Cosa succede quando uno script PHP accede a un database MySQL allo stesso tempo, più di una volta?

Il primo SELEZIONA e ottiene un numero da una colonna di una riga specifica decisa da qualche ID.

Quindi se il numero è positivo, il secondo AGGIORNA la colonna sottraendo un determinato importo.

Ovviamente questo è un caso classico in cui vorrei usare le transazioni o bloccare o mutex o cosa fare.

Le mie domande è questa: in un sito web è del tutto possibile che due o più utenti di chiamare lo script allo stesso tempo, per la stessa riga. Se non si utilizzano le transazioni o le tabelle di blocco, come verrà elaborato da PHP? Sono due query/chiamate di funzione ma sono in uno script. Attende l'intero script per tornare al suo corrispondente utente per eseguirlo di nuovo per un altro utente o perché sono query diverse a causa di pseudoparallelismo potrebbe eseguire la prima query su più utenti che chiamano lo stesso script e quindi il secondo per un set diverso.

Fondamentalmente sto chiedendo perché sto facendo qualcosa in cui non ho abbastanza permessi per usare transazioni o serrature e voglio sapere se posso evitare un mutex (non sono sicuro della parola, fondamentalmente un nuova tabella per i chiamanti, prima di chiamare lo script sopra chiamerò un nuovo script prima di quello in cui girerò la colonna booleana del tavolo vero per scrivere così gli altri non possono cantare mentre lo script originale finisce e poi bacl su false quindi il prossimo in linea può fare e così via)

Modifica: Non sono sicuro di selezionare per l'aggiornamento se le autorizzazioni sono incluse nel suddetto. Il ragazzo responsabile di rispondere alle mie domande è difficile da trovare e l'ho avuto con me a cercarlo ...

risposta

1

È molto strano che sia possibile eseguire l'aggiornamento, ma non è possibile bloccare la tabella (l'aggiornamento è la tabella di blocco per alcuni motori e file di blocco per altro). Ma se davvero non puoi bloccare in quel modo puoi usare get_lock function. Funziona come mutex.

P.S. Se si utilizza l'aggiornamento solo con assegnazione (set a=10) è possibile perdere alcuni dati. Se si utilizza assegnazione con ref sul file (set a=10+a) non è mai accaduto.

+0

Sì, ho appena ricevuto una risposta che POSSO bloccare i tavoli ... quindi avevi ragione. Per quanto riguarda la P.S, in realtà è quello che sto facendo; usando un riferimento sulla colonna (free = free - {$ diff}) –

+0

Quindi ora so che posso usare SELECT ... FOR UPDATE. Sai come funziona? Il modo in cui l'ho capito blocca le righe del risultato (dalla query di selezione) sia per leggere (selezionare) e scrivere (aggiornamento), ma non sono sicuro quando le rilascerà ... Dopo il prossimo aggiornamento su quelle righe? –

+1

SELECT ... FOR UPDATE funziona solo nelle transazioni. Bloccherà le file fino alla fine della transazione. – sectus

0

Non puoi farlo in una sola chiamata, in questo modo non importa troppo?

UPDATE T1 
    SET T1.COLUMN = T2.COLUMN - 4 
    FROM TABLE1 AS T1 
    INNER JOIN TABLE2 AS T2 
     ON T1.COLUMN = T2.COLUMN 
    WHERE T2.COLUMN = ID 
    AND T2.COLUMN > 0 
+0

ho davvero semplificato troppo il processo perché per la domanda principale non era necessario conoscere i dettagli della sceneggiatura. Basti dire che ci avevo già pensato e sarebbe una query molto ampia e complicata. Grazie per il pensiero però :) –

Problemi correlati