Nov sam na ovom forumu, kao i korišćenju PostGreSQL-a.
Pročitao sam jedan komentar,objašnjenje na
http://arhiva.elitesecurity.or...ofiranje-oko-upisa-stavke-bazu ([ zoranix @ 05.01.2011.
21:24 ] @ ). Sasvim dobro objašnjenje.
Mene konkretno zanima onaj deo koji se odnosi na excl. zaključavanje tabele (
"Totalna zaštita sleda ID je moguća ako baza podržava zaključavanje tabela (neke ovo ne podržavaju, pa treba videti u dokumentaciji...)
U tom slučaju si s programesrske strane opušteniji:"). Da li može primer kako se u PostGreSQL-u excl.zaključava tabela (npr. tabela brojač)?
Posle je navedeno 5 tačaka, šta dalje i kako.
"Totalna zaštita sleda ID je moguća ako baza podržava zaključavanje tabela (neke ovo ne podržavaju, pa treba videti u dokumentaciji...). U tom slučaju si s programesrske strane opušteniji:
1. Pokreneš transakciju;
2. Pokušaš da zakljjučaš tabelu ekskluzivno, i ako ne uspeš vrtiš se u petlji dok ne uspeš. Ovo je momenat kada je već neko drugi zaključao tabelu iz istih razloga i ti ga čekaš u petlji dok on ne završi posao. Ovde je potrebno obezbediti kratko trajanje transakcije kako bi rad bio manje-više normalan (kod unosa podataka se to neće primetiti puno, ali kod masovnog insertovanja hoće i te kako).
3. Uspelo je zaključavanje, sada je tabela samo tvoja i ti insertuješ samo neophodne podatke u kolonama, čije obezbeđivanje ne traži puno vremena i koje si obavezan da imaš prilikom izvođenja INSERT naredbe, sa ID-om iz sekvenc-generatora.
4. Upis je uspešan, radiš COMMIT, ako nije saopštavaš grešku i radiš ROLLBACK.
5. Ažuriraš preostale kolone sa UPDATE sa ID-om iz sekvence koji si koristio kod INSERT-a.
Ovaj poslednji scenario garantovano ne pravi "rupice" u sledu brojeva i ja ga često koristim, a verujem da će i tebi koristiti."
Pretpostavljam da za INSERT bih koristio SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ; BEGIN;
Zamolio bih da mi napišete primer koji bi u PostGreSQL-u odradio tih 5 tačaka, sa excl.zaključavanjem tabele.
Npr.: Unosi se faktura. Imam neke npr. osnovne tabele (Dokumenti,Stavke,Brojac,Zalihe... ne bitno kako se zovu, suština je bitna).
Kroz formu unosim podatke o dokumentu, potom unesem stavke fakture i kliknem na dugme Snimi.
Kako izgleda primer za PostGreSQL, koji bi odradio onih 5 tačaka, kako se ne bi duplirao broj, kao i da ne nastane "rupa" u brojevima faktura.
Unapred Vam hvala na odgovoru i primeru.