Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wiele zapytań równocześnie
ayeo
post 22.06.2007, 01:36:18
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...


--------------------
Go to the top of the page
+Quote Post
SongoQ
post 22.06.2007, 10:33:52
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.


--------------------
Go to the top of the page
+Quote Post
ayeo
post 22.06.2007, 11:44:45
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 sad.gif

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 smile.gif


EDIT2
No panowie!! Smialo pisac swoje sugestie smile.gif

Ten post edytował harold1982 5.07.2007, 22:30:59


--------------------
Go to the top of the page
+Quote Post
fulgore
post 17.10.2007, 17:41:29
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ł smile.gif


pozdrawiam

Ten post edytował fulgore 17.10.2007, 17:44:12
Go to the top of the page
+Quote Post
prond
post 23.10.2007, 15:34:49
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:
  1. BEGIN WORK;
  2. LOCK TABLE groups IN ACCESS EXCLUSIVE;
  3. -- SELECT costam
  4. -- INSERT / UPDATE etc.
  5. COMMIT WORK;


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
ayeo
post 5.11.2007, 23:46:14
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?


--------------------
Go to the top of the page
+Quote Post
msulik
post 8.11.2007, 19:55:31
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
Go to the top of the page
+Quote Post
ayeo
post 9.11.2007, 14:29:54
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ć? smile.gif

Ten post edytował harold1982 10.11.2007, 12:35:47


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 10:47