Originariamente inviato da markzzz
salve. vorrei avere una delucidazione su un dubbio che mi salta in mente riguardo a una condizione di race condition in fase di update all'interno del database.

supponiamo di avere questa tabella chiamata tracklist con questi record :

id block name

1 0 paolo
2 0 marco
3 0 luca

se io eseguo questa query in contemporanea su due thread distinti (due richieste nello stesso momento):

$update = mysql_query("UPDATE tracklist SET block = '1' WHERE name='marco' AND block='0'",$mydb);

il primo che arriva fà il lock sul record con id 2, e lo aggiorna. l'altra richiesta, contemporanemante, come si comporta?

1-arriva all'id 1 e la scarta (nome è paolo non marco), vede che id2 è bloccata, aspetta, la seleziona e (non rispettando più la regola del where, essendo ora block = 1) la scarta e và avanti

2-arriva all'id 1 e la scarta, (anche quì nome è paolo non marco), seleziona il record 2 e appena il thread che l'aveva bloccata la "sblocca" fà l'update del campo

3-nessuna delle 2

se qualcuno ha idea, mi farebbe un favore! grazie mille

Guarda, che io sappia tutte le query vengono serializzate, e quindi viste come atomiche. Il concetto è analogo a quello dei lock semplici,

- se tutti gli oggetti non sono occupati acquisisci il lock, fai la query e rilasci il lock
- se almeno un oggetto è occupato attendi finché non viene rilasciato il lock

Il semplice risultato che porta questa sincronizzazione è quello di eseguire sempre e comunque una query alla volta (se collidono), quindi ci saranno effettivamente 2 query eseguite in serie:

$update = mysql_query("UPDATE tracklist SET block = '1' WHERE name='marco' AND block='0'",$mydb);
$update = mysql_query("UPDATE tracklist SET block = '1' WHERE name='marco' AND block='0'",$mydb);

La prima query (invocata dal primo thread schedulato) esegue la modifica, quindi si avrà

1 0 paolo
2 1 marco
3 0 luca

La seconda query non trova nessuna riga che rispetta il WHERE, quindi non esegue alcuna modifica.

Per maggiori info potresti dare un'occhiata al MySQL Reference Manual, nella sezione "synchronization"