Autor Zpráva
hugo123
Profil *
Ahojte,

mam takyto problem, vykonavam takyto kod:

for($ii=1; $ii <= 1000; $ii++) 
    $conn -> query("UPDATE db_nazov SET poradie = ".$ii." WHERE id = ".$polozka_id"");

A ono to NIE vzdy urobi rovnako, co nechapem preco, ale jednoducho by to mohol vyriesit nejaky LOCK pred tym ked idem vykonat prikaz UPDATE.

Existuje prosim nieco take?

Vopred dakujem velmi pekne.
doyle
Profil
Zkoušet něco zamykat pokud si nejste jist co se děje není moc dobrej nápad (hrozí například uváznutí[deadlock], kde se dva procesy mohou navzájem zablokovat a neskončí). Spíš je lepší podobnou sérii dotazů uzavřít do transakce, tady ale vyplynou dvě otázky - jde o MySQL DB ? jestli ano - používate InnoDB úložiště nebo MyISAM ? MyISAM např. nepodporuje transakce

Obecně, aby bylo potřeba něco zamykat musí být splněna tzv. race condition. Ta je splněna například ve chvíli, kdy je vytvořen druhý request na stejný php skript dřívě, než se první stihne dokončit. Potom se může stát, že uvedený for cyklus běží dvakrát "vedle sebe" v instanci A a B(odpovídající prvnímu a druhému requestu). Pak mohou SQL příkazy z A předběhnout(proto race condition) příkazy z B a naopak. Výsledkem může být něco, co vzniklo spuštěním série mezi sebou promícháných příkazů z A a B.

Transakce vám pomůže provést sérii příkazů nad DB tak, že se mezi sebou nepromíchají a výsledek bude jako po spuštění celé série A a pak série B nebo naopak.
Kajman
Profil
hugo123:
vykonavam takyto kod

Vzhledem k tomu, že $polozka_id je stále stejná, stačí snad jediný update, který nastaví poradie na 1000.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: