[ novi_v_pgsql @ 04.10.2012. 22:30 ] @
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.
[ chachka @ 25.10.2012. 10:25 ] @
Sve navedene tačke se rade na aplikacionom nivou i nemaju puno veze sa PostgreSQL-om.
[ novi_v_pgsql @ 06.12.2012. 18:20 ] @
Citat:
chachka: Sve navedene tačke se rade na aplikacionom nivou i nemaju puno veze sa PostgreSQL-om.

Dobro,a kako bih onda to rešio na serverskoj strani? Imate li neki primer?
[ novi_v_pgsql @ 25.04.2013. 18:38 ] @
Citat:
chachka: Sve navedene tačke se rade na aplikacionom nivou i nemaju puno veze sa PostgreSQL-om.

Citat:
novi_v_pgsql: Dobro,a kako bih onda to rešio na serverskoj strani? Imate li neki primer?
.

Zamolio bih da mi napišete primer koji bi u PostGreSQL-u odradio tih 5 tačaka (ili "deo" tih tačaka), sa excl.zaključavanjem tabele.

[ gosha @ 25.04.2013. 19:17 ] @
http://www.postgresql.org/docs/9.0/static/sql-select.html

pa pogledaj "for update"

Poz. Goran
[ novi_v_pgsql @ 27.04.2013. 06:55 ] @
Citat:


Hvala ti Gorane, mislim da je to ono što mi treba.
Koliko vidim SELECT ... FOR UPDATE ... zaključava slog (npr. slog od tabele brojača) i on je nedostupan ostalim korisnicima, sve dok se ne završi transakcija.

Da li sam upravu?
[ gosha @ 27.04.2013. 08:29 ] @
Da. Biće zaključano do komitovanja ili rolbeka.

Poz. Goran