![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Witam wszystkich czytających....
Opisze może na przykładzie o co mi chodzi: Skrypt tworzy 10 osobowe grupy. Kazdy uzytkownik moze sie zapisac do grupy. Skrypt zapisuje uzytkownika do pierwszej wolnej grupy, jesli nie ma wolnej to zaklada kolejna grupe i powtarza poprzedni krok. Proste. Problem polega na tym, ze jak to sie wszystko zachowa gdy wielu uzytkownikow sprobuje zapisac sie jednoczesnie? W sensie skrypt sprawdzi, ze w grupie jest 9 osob (2 razy niezaleznie) i dopisze dwie osoby i bedzie 11... -------------------- |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Prawdopodobienstwo czegos takiego jest male. Ale w pg mozesz zrobic tak dodatkowa tabela. Najpierw lock na tabele potem sprawdzenie utworzenie grupy itd a potem zdjecie. To wszystko mozesz zamknac w funkcji.
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Dziekuje za szybka odpowiedz. Problem w tym, ze musze miec 100%pewnosci, ze grupa bedzie zawierala po 10 userow... Nie wiem czy dobrze rozumiem transakcje bo co jesli:
- dla usera sprawdzam (w izolacji) ilosc uzytkownikow w grupie - jesli jest mniej niz 10 userow w grupie dopisuje do grupy usera A - koncze transakcje Problem: - user B (w tym samym czasie probuje sie dopisac) - sprawdzanie ilosci osob w grupie nie uwzglednia uzytkownika A bo transakcja jest nie zakonczona i stwierdza, ze jest mniej niz 10 osob w grupie - zapisanie usera B do grupy - koniec transakcji ![]() Konczac transakcje dla usera B dopisze go jako 11 do grupy bo sprawdzanie ilosci userow w grupie dalo bledny wynik... Czy jest mozliwe w PG jakies kolejkowanie w sensie blokowanie kolejnych zapytan na czas trwania poprzednich? Chcialbym, zeby skrypt poprostu poczekal na wolny dostep do bazy, a nie zeby odzucal zapytanie. EDIT Tak sobie mysle (jak sie mysle to prosze mnie wyprowadzic z bledu) ze jesli stopien izolacji dam na read uncommited to bedzie ok. Transakcje niezalezne beda widzialy zmiany przed ich zaakceptowaniem. Userzy nie musza byc dopisywani po kolei do grup, a funkcja szuka pierwszej wolnej grupy wiec jak transakcje odrzuce to pozniej i tak kogos sie dodat do starej grupy ![]() EDIT2 No panowie!! Smialo pisac swoje sugestie ![]() Ten post edytował harold1982 5.07.2007, 22:30:59 -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 17.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
miałem kiedys podobny problem ale z ankietami - do aplikacji mialo sie logowac wielu uzytkownikow i pobierac ankiety w celu obdzwonienia uzytkownikow z ankiety i przeprowadzenia rozmowy.
rozwiazalem go w najprostszy sposob jaki wydawal mi sie sluszny, a mianowicie: mialem tabele ankiety i pobrane_ankiety. Funkcja najpierw sprawdzala czy dana ankieta jest pobrana (zapisana w pobrane_ankiety) i jak nie byla to ja pobierała, ale - I TU JEST ROZWIAZANIE:) - w przypadku gdyby w trakcie zapisu tej ankiety do tabeli pobrane_ankiety inny użytkownik już zapisal ja szybciej postanowilem zrobic w krotkim odstepie czasu kolejne zapytanie sprawdzające czy rekordy w tabeli pobrane_ankiety sie niepowtarzaja jesli by sie powtarzaly kasowana byla by ta ankieta i proces prebiegal by od nowa. (w tabeli pobrane_ankiety bylo pole id auto_increment wiec osoba kutara w takim wypadku miala niższe id obslugiwala ankiete a ta reszta losowala ponownie) Takie rozwiazanie dla moich potrzeb wystarczalo a mialo znaczenie bo aplikacja byla wykozystywana przez powana firme i niemogli sobie pozwolic na dzwonienie dwa razy do tej samej osoby - wizerunek firmy by podupadł ![]() pozdrawiam Ten post edytował fulgore 17.10.2007, 17:44:12 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 254 Pomógł: 10 Dołączył: 8.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Panowie, po co te tricki ? Wystarczy zrobic to wlasnie tak, jak napisal SongoQ.
Jak chcesz byc na 100% pewien izolacji transakcji uzyj locka 'ACCESS EXCLUSIVE' przy modyfikacji grup:
-------------------- --------------------------------------------------------------------------------
weblog.axent.pl -------------------------------------------------------------------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Może mi ktoś wytłumaczyć co się stanie jeśli zrobię locka ('ACCESS EXCLUSIVE'), a kolejny skrypt będzie się łączył dla innego usera? W sensie poczeka, aż lock zostanie zdjęty czy co?
-------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 83 Pomógł: 0 Dołączył: 31.03.2002 Skąd: Toruń Ostrzeżenie: (0%) ![]() ![]() |
Si. Czyż nie mówi o tym manual postgresa?
Cytat LOCK TABLE obtains a table-level lock, waiting if necessary for any conflicting locks to be released.
-------------------- misiu | chór
"Zdeterminowany programista potrafi stworzyć fatalny kod w każdym języku" Allen Holub |
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
A można blokować pojedyncze rekordy (ROWS) ?
EDIT: Podobno postgres zakłada row-level lock automatycznie dla transakcji modyfikujących dany wiersz? W sensie nie ma się co przejmować? ![]() Ten post edytował harold1982 10.11.2007, 12:35:47 -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 10:47 |