[ Ivan Golubović @ 14.02.2012. 00:59 ] @
E sad, blago meni ispisao sam ja lepo tridesetak linija koda, ali imam problem kako da održim integritet podataka. Sve radi super sada (dok sam ja jedan korisnik), ali šta se dešava kada nas ima 100, kada nestane struja, zabaguje server ili bilo šta slično... Da li nekako mogu da zaključam tabele tako da samo određeni proces može da upisuje podatke u tom trenutku, a ostali da čekaju...
Evo i koda:
Code:
    $sqli = "SELECT * FROM `cart_isporuka` WHERE ((dok='".$dok."') AND (proknjizeno=0));";
    $qi = mysqli_query($link, $sqli);
    while($ri=mysqli_fetch_assoc($qi))
    {
        $sql = "SELECT kolicina FROM lager WHERE ((did='".$ri["did"]."') AND (mid='".$ri["mid"]."'))";
        $q = mysqli_query($link, $sql);
        $rez = mysqli_num_rows($q);
        if($rez == 0)
        {
            $trenutna_kolicina = 0 - $ri["kolicina"];
            $sql_i = "INSERT INTO lager (did, mid, kolicina) 
            VALUES
            (    '".$ri["did"]."',
                '".$ri["mid"]."',
                '".$trenutna_kolicina."')";
        }
        else while($r=mysqli_fetch_assoc($q))
        {
            $trenutna_kolicina = $r["kolicina"] - $ri["kolicina"];
            $sql_i = "UPDATE lager 
                        SET `kolicina` = '".$trenutna_kolicina."'  
                        WHERE ((`did` = '".$ri["did"]."') 
                        AND (mid = '".$ri["mid"]."'));";
        }
        $q_i = mysqli_query($link, $sql_i);
        $sql_i = "UPDATE cart_isporuka 
                        SET `proknjizeno` = '1'  
                        WHERE (`id` = '".$ri["id"]."');";
        $q_i = mysqli_query($link, $sql_i);
    }
    $sql_i = "UPDATE cart_docs 
                        SET `status` = '5',   `obradio` = '".$_SESSION['SESS_MEMBER_ID']."'
                        WHERE (`dok` = '".$dok."');";
    $q_i = mysqli_query($link, $sql_i);
[ bogdan.kecman @ 14.02.2012. 08:41 ] @
za innodb imas transakcije (pogledaj mysql uputstvo za begin i commit, pogledaj "mysql isolation level")
za myisam mozes da zakljucas tabelu (mysql lock table)
[ Ivan Golubović @ 15.02.2012. 14:03 ] @
Gledao sam ovo i ovo je ok, sa strane da se izvrše sve operacije ili nijedna. InnoDB su tabele.
Za početak koristim START TRANSACTION i za kraj COMMIT.
ROLLBACK nema potrebe da koristim jer se to radi po automatizmu, jel tako?

Još jedna stvar koja me zanima, šta se dešava ako se sa dve različite strane pokrenu istovremeno transakcije? Konkretno, da transakcija 1 traži stanje lagera i menja ga na recimo 5 (sa 6) i u istom tom trenutku transakcija 2 traži stanje lagera i šta dobija kao rezultat? Da li će dobiti 5 ili 6? Znam da je mala šansa da se ovo desi, ali moram da znam...



[ bogdan.kecman @ 15.02.2012. 14:18 ] @
nikad se nista ne desava "istovremeno", uvek je nesto pre necega.

postoji mogucnost da imas deadlock ali tada ce obe transakcije da puknu, procitaj:
http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html
http://dev.mysql.com/doc/refman/5.5/en/innodb-lock-modes.html
[ Ivan Golubović @ 15.02.2012. 16:35 ] @
Onda je ovo sasvim dovoljno. Hvala na pomoci.