ugrás a tartalomhoz

A PHP értelmezés több szálon fut?

Webdev · 2011. Jún. 4. (Szo), 11.55
Sziasztok!

Az érdekelne, hogy a PHP fájlok értelmezése több szálon fut-e?
Gyakorlatban:
$query = mysql_query("SELECT sorszam FROM fontos_adatok WHERE tulaj = "én" ORDER BY Id DESC LIMIT 1");
$fetch = mysql_fetch_array($query);

/* A végrehajtás innen átadódhat-e egy másik szálra, ami éppen a "fontos_adatok" táblát írja?*/

@mysql_query("INSERT INTO fontos_adatok VALUES ('".(fetch['sorszam'] + 1)."', 'stb', 'stb')");

A vázolt esetben előfordulhat az, hogy az INSERT parancsnál már nem aktuális a fetch['sorszam'] értéke? Nagyszámú kérések, terhelés esetén.

(Az autoincrement erre a "sorszam" oszlopra nem alkalmazható!)

Ha ez a hibalehetőség előfordulhat, hogyan védhető ki?
 
1

Nem fut több szálon. Viszont

Protezis · 2011. Jún. 4. (Szo), 12.56
Nem fut több szálon. Viszont ha párhuzamosan elindítod ugyanezt a kódrészletet (pl. párhuzamos request), akkor előfordulhat, hogy a select és az insert között egy másik process végrehajt egy insertet. A megoldás: tranzakció.
2

igen, bar nem tobb szalon, de

Tyrael · 2011. Jún. 4. (Szo), 14.57
igen, bar nem tobb szalon, de tobb peldanyban(process) futhat parhuzamosan a fent emlitett kod.
a fenti problemara tobb megoldas is van:
  • atomic utasitasokat hasznalsz (pl. a te peldadnal maradva nem select + insertet csinalsz, hanem INSERT INTO ... SELECT a+1 FROM -et)
  • lockolsz, azaz garantalod, hogy az adott kodreszlet ne futhasson parhuzamosan. ezt szinten tobbfelekeppen meg lehet oldani, de a te esetedben ezek allnak rendelkezesre:
  • ha innodb-t hasznalsz, akkor pakold bele egy tranzakcioba a select + insert query-ket, ahogy mar fentebb is emlitettek.
  • ha myisam-ot, vagy egyeb nem-tranzakcios tablatipust hasznalsz, akkor lockolhatod az adott tablat, amig le nem fut a kritikus resze a kododnak.

Tyrael
3

Lock és/vagy tranzakció

joed · 2011. Jún. 16. (Cs), 09.41
Az adatbázis rendszertől függően lock-olnám a táblát vagy tranzakcióba foglalnám a kritikus műveleteket. Egyes adatbázis absztrakciós rétegek (pl. Zend_DB) egész ügyesen megoldáják dolgot, szerintem megéri utánanézni.
4

fejben tisztázz

tamicskod · 2011. Jún. 16. (Cs), 10.12
Szia, a kérdésfeltevésedből és a példádból úgy tűnik, hogy a futó fejlesztés mellett nem ártana egy kis időt szánnod az alapokra. Hogy működik egy webszerver, hogy futtatja a php állományaidat. Ha több komponensű rendszert futtatsz, hogyan oldd meg az ezzel felmerülő problémáidat. Milyen terhelés mellett van szükség űrtechnikára.

Nekem a bőröm a "select sorszam, insert sorszam+1" jellegű dolgoktól mindig kicsit lúdbőrös lesz. Ne érts félre, lehet hogy indokolt az esetedben az alkalmazott technika. A példádból nem sok minden derül ki, így ezt neked kell eldöntened. A korábban írtak, mind hasznos infók a témakörben, de akárhogy is döntesz, a megvalósítás után egy kis idővel gondold át újra az egészet, lehet hogy később nem is fogsz ilyen helyzetbe kerülni.