PDA

Pogčedajte punu verziju : Formulari i 'race condition'


Miroslav Ćurčić
20. 05. 2012., 14:03
Šta se u praksi pokazalo kao najbolje rešenje za sprečavanje 'race condition' situacije kod editovanja formulara ?

Primer:

Administrator 1 je otvorio formu stranicu kojom posmatra sadržaj nekog zapisa iz baze, i počinje da ga edituje, jer mu se recimo ne sviđa naslov artikla.

Administrator 2 zatim otvara na svom računaru istu tu stranicu i gleda sadržaj istog tog zapisa iz baze, jer recimo želi da cenzuriše psovku iz teksta artikla.

Admin 1 je izmenio naslov i pritiska dugme 'Save' i snima nov sadržaj formulara u bazu.

Admin 2 završava cenzurisanje teksta i pritiska 'Save'. Time u stvari on pregazi naslov teme originalnim sadržajem i tako slučajno anulira efekat prvog admina.

Kako je to rešeno u nekim većim sistemima ? :confused:
Zaključavanje editovanja zapisa ne dolazi u obzir.

ivanhoe
20. 05. 2012., 17:49
Po meni je najbolje resenje da pamtis last_updated timestamp u samom formularu i onda kod snimanja ako se to ne poklapa sa onim u bazi, treba upozoriti da su podaci u medjuvremenu izmenjeni i pitati da li da ih zgazi ili ne. Ponudis da se u drugom prozoru otvore svezi podaci, pa nek uporede i urade rucni merge.

Ako imas vremena da se zezas, moze se napraviti i da sistem sam uporedi sve podatke redom i da vidi tacno koji su izmenjeni i to odmah pokaze ili cak da uradi automatski merge (nije to tako tesko: ako je polje menjala samo jedna osoba, zadrzi se poslednja izmena.. kao svn sto radi, buni se samo ako su oboje menjali isti podatak). Takodje dobro je i da se pamti ko je sve menjao fajl, hronoloski, pa da osoba A moze da pozove osobu B i konsultuje se oko izmena.

Peca
20. 05. 2012., 18:02
ili snimis samo deo za koji zakljucis da je izmenjen...

tu bi moglo preko javascripta da se napravi da korisnik prvo klikne misem na pasus koji zeli da izmeni - onda samo taj deo postane edit-abilan - i posle samo njega snimas u bazu.

ako neko drugi isti taj pasus menja u tom trenutku - onda upozoris korisnike.

s tim sto to podrazumeva da svaki pasus ima svoj ID broj...

ivanhoe
20. 05. 2012., 20:59
to je ok za jednostavno editovanje texta, tipa CMS-a, ali zamisli neki sluzbeni formular tipa racunovodstva i radnika koji mora da ceka da ajax proveri svako polje da bi mogao da unese podatak. Ove sto su navikle na Clipper mi se i ovako bune da nije dovoljno brzo u browseru :)

Da budem iskren, ja se sa tim nikad nisam zezao, naprosto zakljucam editovanje ako je neko drugi otvorio i ispisem poruku tipa: "Pera Peric trenutno edituje ovaj formular, kontaktirajte ga da ga zatvori." i cao.

Peca
21. 05. 2012., 20:32
ne vidim sto bi se na javascript izgubilo vreme... dok korisnik otkuca prvo slovo on ce u pozadini proveriti lock... a submit ko submit, isto za sekund posaljes i stigne odgovor, kao i svaki HTTP POST...

mangia
21. 05. 2012., 21:02
Izgleda da nisi radio sa ljudima koji su penziju dočekali radeći u Clipper-u i crno-plavom interfejsu... :)

McKracken
21. 05. 2012., 22:24
Summer '87 FTW!

Milos Vukotic
22. 05. 2012., 16:50
Da budem iskren, ja se sa tim nikad nisam zezao, naprosto zakljucam editovanje ako je neko drugi otvorio i ispisem poruku tipa: "Pera Peric trenutno edituje ovaj formular, kontaktirajte ga da ga zatvori." i cao.
Sasvim dovoljno. Ako imaš veliki broj korisnika koji u svakom trenutku mogu editovati istu stvar onda ti je 'race condition' najmanji problem :)