Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zaključavanje tabele za pisanje

[es] :: MySQL :: Zaključavanje tabele za pisanje

[ Pregleda: 1926 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Ivan Golubović
AV market
Požarevac

Član broj: 3154
Poruke: 586
*.dynamic.sbb.rs.

Sajt: www.AVmarket.rs


+7 Profil

icon Zaključavanje tabele za pisanje14.02.2012. u 00:59 - pre 147 meseci
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);
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Zaključavanje tabele za pisanje14.02.2012. u 08:41 - pre 147 meseci
za innodb imas transakcije (pogledaj mysql uputstvo za begin i commit, pogledaj "mysql isolation level")
za myisam mozes da zakljucas tabelu (mysql lock table)
 
Odgovor na temu

Ivan Golubović
AV market
Požarevac

Član broj: 3154
Poruke: 586
*.dynamic.sbb.rs.

Sajt: www.AVmarket.rs


+7 Profil

icon Re: Zaključavanje tabele za pisanje15.02.2012. u 14:03 - pre 147 meseci
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...



 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Zaključavanje tabele za pisanje15.02.2012. u 14:18 - pre 147 meseci
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

 
Odgovor na temu

Ivan Golubović
AV market
Požarevac

Član broj: 3154
Poruke: 586
*.dynamic.sbb.rs.

Sajt: www.AVmarket.rs


+7 Profil

icon Re: Zaključavanje tabele za pisanje15.02.2012. u 16:35 - pre 147 meseci
Onda je ovo sasvim dovoljno. Hvala na pomoci.
 
Odgovor na temu

[es] :: MySQL :: Zaključavanje tabele za pisanje

[ Pregleda: 1926 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.