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?
  1. @mysql_query("BEGIN");  
  2. $lekerdezes = mysql_query("SELECT mennyiseg FROM tabla WHERE id = '1' LOCK IN SHARE MODE");  
  3. if($lekerdezes)  
  4. {  
  5.     $mennyiseg = mysql_result($lekerdezes,0,'mennyiseg');  
  6.     $uj_mennyiseg = $mennyiseg - 5;  
  7.     if($uj_mennyiseg < 0)  
  8.     {  
  9.         @mysql_query("ROLLBACK");  
  10.         print "Nincs megfelelő mennyiség!";  
  11.         exit;  
  12.     }  
  13.     else  
  14.     {  
  15.         $modosit = mysql_query("UPDATE tabla SET mennyiseg = '$uj_mennyiseg' WHERE id = '1'");  
  16.         if($modosit)  
  17.         {  
  18.            @mysql_query("COMMIT");  
  19.            print "Adatok sikeresen módosítva!";  
  20.         }  
  21.         else  
  22.         {  
  23.            @mysql_query("ROLLBACK");  
  24.            print "Az adat módosítása sikertelen!";  
  25.            exit;  
  26.         }  
  27.     }  
  28. }  
  29. else  
  30. {  
  31.     @mysql_query("ROLLBACK");  
  32.     print "A rekordot jelenleg nem lehet módosítani, próbálja újra!";  
  33. }  
Ü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