ugrás a tartalomhoz

MySql visszatérési értékek SELECT FOR UPDATE és LOCK IN SHARE MODE használata esetén.

s_volenszki · 2007. Ápr. 25. (Sze), 11.16
Sziasztok!

Azon agyaltam, hogy ha mysql-ben php-vel kiválasztok egy rekordot mert módosítani akarom (de más olvashassa a régi tartalmat módosítás alatt) LOCK IN SHARE MODE-ban és az már egy másik felhasználó által LOCK IN SHARE MODE-olva lett, akkor nekem hibaüzi jön arról hogy az most éppen foglalt?

Tehát:

$lekerdezes = mysql_query("SELECT mennyiseg FROM tabla WHERE id = '1' LOCK IN SHARE MODE");

Akkor a fent említett esetben a $lekerdezes = false?

Mert ugye ha ugyan arra a rekordra pályázunk, akkor a tranzakció sikeressége érdekében nem csak a változtatás végrehalytásának, általunk meghatározott kritériumokra megfelelőségét kell figyelni, hanem azt is, hogy a rekord kiválasztása után lesz-e egyáltalán lehetőségünk változtatni.

Konkrétan ez így helyes?

@mysql_query("BEGIN");
$lekerdezes = mysql_query("SELECT mennyiseg FROM tabla WHERE id = '1' LOCK IN SHARE MODE");
if($lekerdezes)
{
    $mennyiseg = mysql_result($lekerdezes,0,'mennyiseg');
    $uj_mennyiseg = $mennyiseg - 5;
    if($uj_mennyiseg < 0)
    {
        @mysql_query("ROLLBACK");
        print "Nincs megfelelő mennyiség!";
        exit;
    }
    else
    {
        $modosit = mysql_query("UPDATE tabla SET mennyiseg = '$uj_mennyiseg' WHERE id = '1'");
        if($modosit)
        {
           @mysql_query("COMMIT");
           print "Adatok sikeresen módosítva!";
        }
        else
        {
           @mysql_query("ROLLBACK");
           print "Az adat módosítása sikertelen!";
           exit;
        }
    }
}
else
{
    @mysql_query("ROLLBACK");
    print "A rekordot jelenleg nem lehet módosítani, próbálja újra!";
}
Üdv, s_volenszki
 
1

Lehet hogy rosszul kérdeztem?

s_volenszki · 2007. Ápr. 26. (Cs), 14.41
Lehet hogy rosszul (hülyeséget) kérdeztem, vagy csak senkit nem mozgat a téma. Felteszem másképp! Hogyan tudom tesztelni a szituációt? Tegyek egy 60 másodperces késleltetést a script-be, és két kliensként támadjam meg ugyanazt a rekordot? :)

s_volenszki