Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mysql zawiodlo przy duzej ilosci userow
Forum PHP.pl > Forum > Bazy danych > MySQL
inwob
Witam!
Napisałem skrypt który automatycznie rozdaje konta lecz zawiódł przy dużej ilości chętnych.
Wygladal on mniej wiecej tak

  1. $selee = mysql_query("znajdz wszystkich graczy spejniajacych kryteria");
  2. if(jesli znalazl cos) {
  3. while ($sel = mysql_fetch_assoc($selee)) { // sprawdz az znajdzie wolne konto
  4. $seleee = mysql_query('Sprawd czy konta juz ktos nie dostal tego konta');
  5. if (@mysql_num_rows($seleee)) {
  6. break;
  7. }
  8. }
  9. if (@mysql_num_rows($seleee)) {
  10. mysql_query("ustaw wlasciciela konta!");
  11. }
  12. }


Miałem kilka przypadków że kilka osób dostało to samo konto (uzyli skryptu w tym samym czasie)
Jak temu zapobiec?
wookieb
Użyć transakcji. Jak? google->Mysql transaction
vtuner
Cytat(inwob @ 30.09.2010, 17:12:59 ) *
Napisałem skrypt który automatycznie rozdaje konta lecz zawiódł przy dużej ilości chętnych.
Wygladal on mniej wiecej tak

  1. (...)
  2. while ($sel = mysql_fetch_assoc($selee)) { // sprawdz az znajdzie wolne konto
  3. $seleee = mysql_query('Sprawd czy konta juz ktos nie dostal tego konta');
  4. if (@mysql_num_rows($seleee)) {
  5. break;
  6. }
  7. }
  8. (...)


Zawiódł, bo nie umiesz pisać. Nigdy nie wykonuj zapytań w pętli.

Cytat(inwob @ 30.09.2010, 17:12:59 ) *
Jak temu zapobiec?


Ja często pisząc "zwykłym" PHP stosuje takie rozwiązanie.

  1. $arrAccounts = array();
  2. $seleee = mysql_query('Sprawdz kto dostal konta');
  3. if (mysql_num_rows($seleee) > 0) {
  4. while ($row = mysql_fetch_assoc($seleee)) {
  5. $arrAccounts[] = $row['identyfikator_uzytkownika'];
  6. }
  7. }
  8.  
  9.  
  10. $seleee = mysql_query("znajdz wszystkich graczy spejniajacych kryteria");
  11. if(mysql_num_rows($seleee) > 0) {
  12. while ($sel = mysql_fetch_assoc($seleee)) { // sprawdz az znajdzie wolne konto
  13. if(in_array($sel['identyfikator_uzytkownika'], $arrAcounts)) {
  14. break;
  15. }
  16. }
  17. mysql_query("ustaw wlasciciela konta!");
  18. }


Rozwiązanie może nie jest super poprawne, ale na pewno tak szybko nie zawiedzie smile.gif
yevaud
problem o ktorym mowisz pojawia sie nie dlatego ze mysql Cie zawiodl, tylko dlatego ze nie przewidziales tego ze wielu uzytkownikow moze wykonywac ten kod jednoczesnie

jak wspomnial kolega wyzej, najlatwiej jest uzyc transakcji, ale mozesz tez zalatwic to "zaklepujac" jakos zasob dla siebie za pomoca jakiejs operacji atomowej tzn. jak widzisz ze zasob jest wolny(w Twoim wypadku to chyba login), rzucasz insertem ktory go dla Ciebie "zaklepuje", jesli insert z unikalnym polem sie udal tzn. nikt go nie zaklepal przed Toba, to znaczy ze login jest Twoj.

a tak btw naloz indeks unique na login to nie bedziesz rozdawal tych samych kont ludziom, nawet jak cos w kodzie bedzie spieprzone

btw2. rozwiazanie kolegi vtuner tez bedzie sie wykladalo dokladnie tak jak Twoje, tylko moze nie tak czesto
inwob
A ja zrobiłem tak:
  1. $selee = mysql_query("znajdz wszystkich graczy spejniajacych kryteria");
  2. if(jesli znalazl cos) {
  3. while ($sel = mysql_fetch_assoc($selee)) { // sprawdz az znajdzie wolne konto
  4. $seleee = mysql_query('Sprawd czy konta juz ktos nie dostal tego konta');
  5. if (@mysql_num_rows($seleee)) {
  6. $znalazblad = 0;
  7. mysql_query("ustaw wlasciciela konta tam gdzie nie ma wlasciciela!") and or $znalazblad = 1;
  8. if(!(empty($znalazblad))) {
  9. break;
  10. }
  11. }
  12. }
  13. if (@mysql_num_rows($seleee)) {
  14. }
  15. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.