Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 4 odgovora
  • 2.907 pregleda

Najnovija ↓

Zaključavanje tabele za pisanje 14.02.2012. u 01:59 · pre 179 meseci #1
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);
Re: Zaključavanje tabele za pisanje 15.02.2012. u 15:03 · pre 179 meseci #3
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...



Re: Zaključavanje tabele za pisanje 15.02.2012. u 15:18 · pre 179 meseci #4
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
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme