Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Deadlock
Forum PHP.pl > Forum > Bazy danych > MySQL
espeen
Witam.
Potrzebuję kilka przykładów jak wywołać taki błąd w mysql?questionmark.gif
Pilne.
DeyV
słyszałem o sytuacjach, w ktorych komuś zależało, by .. nie wywołać takiego błędu.

Nie znam jednak żadnego rozsądnego i zgodnego z prawem powodu, by go ... wywoływać.

Zamykam.
DeyV
Po subtelnej i grzecznej (hihihi) prośbie o otwarcie tego tematu, temat otwieram.
Oczywiście tylko w celach informacyjnych, bo przecież nie chcemy wywoływać takich błędów na komercyjnych serwerach, i oczywiście – nie rozwiązujemy czyichś „zadań domowych”…
espeen
Niezmiernie mi miło że temat został odblokowany. W takim razie pożyjemy zobaczymy jak forumowicze radzą sobie z generowaniem błędów w mysql, ponieważ jak ogólnie wiadomo nie sztuka poradzić sobie z błędem ale go wywołać gdyż to wymaga dużo większej znajomości mysql.
Ale wierze w to foum smile.gif
Radarek
Hm, a w jakich okolicznosciach taki blad moze sie pojawic? Jak bede mial czas to zerkne na google, ale jak mozesz to napisz cos wiecje o tym bledzie.
mike
Działasz na dwóch konsolach:

Konsola 1
Cytat
> BEGIN;
> UPDATE tabela SET pole = wartość WHERE id = wartość;
>

Konsola 2
Cytat
> BEGIN;
> UPDATE tabela SET pole = wartość WHERE id = wartość;
>


No i masz Deadlock (zakleszczenie).
Dopóki nie dasz COMMIT lub ROLLBACK dla pierwszej transakcji, to druga nie uzyska dostępu do rekordu (tabeli).

Zakleszczenie
Radarek
Aaaa no glupi jestem. Wiem co to zakleszczenie ale jakos w kontekscie mysql mi sie zapomnialo winksmiley.jpg. Podany przyklad przez ~mike_mecha jest ok, z tym, ze w normalnych skryptach "dobrze" zaprojektowanych dla kazdego BEGIN masz ROLLBACK lub COMMIT. I teraz sprawa jest taka, ze nie gwarantuje to, ze taki deadlock nie wystapi. Klasyczny deadlock wystapi, jesli proces A zalozyh blokade na zasob ZA, proces B zalozy blokade na zasob ZB i teraz proces A probuje zalozyc blokade na zasob ZB (ale musi poczekac, az proces B ja sciagnie), zas proces B chce zalozyc blokade na zasob ZA (ale musi poczekac, az proces A ja sciagnie). I wtedy powstanie takie zakleszczenie.
Probowalem przed chwila ulepszyc przyklad podany przez ~mike_mecha w ten spsob, ze wlaczylem sobie 2 konsole. Na obu z nich rozpoczalem transakcje (BEGIN;), potem na konsoli A zrobilem update tabeli X, zas na konsoli B update tabeli Y. Pozniej chcialem zamienic update'y (na konsoli A update tabeli Y, na konsoli B update tabeli X) i o dziwo dostalem komunikat:
Cytat
update AKTUALNY_SEZON set ID_SEZONU=1 where ID_SEZONU=1;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

Nie wiem wiec, czy mozna taki deadlock wywolac w mysql, czy zabezpieczyli sie przed tym sprawdzajac taki graf procesow i zasobow.
SongoQ
@mike_mech Twoj przyklad jest sprawdzony, bo wydaje mi sie sie ze jesli blokujesz calu zasob to 2 transakcja czeka na wykonanie, wiec w tym przypadku zakleszczenia nie bedzie.

Bardziej bym sie trzymal wersji @Radarek

1 transakcja
  1. BEGIN;
  2. UPDATE tabela SET pole = 'wartosc' WHERE pole = 1;
  3. UPDATE tabela SET pole = 'wartosc' WHERE pole = 2;


2 transakcja
  1. BEGIN;
  2. UPDATE tabela SET pole = 'wartosc' WHERE pole = 2;
  3. UPDATE tabela SET pole = 'wartosc' WHERE pole = 1;


Oczywiscie update musi byc na przemian, ale dokladnie to musze sprawdzic.
espeen
Spoko.
Fajne przykłady oto mi mniej wiecej chodzi. Czekam na więcej smile.gif
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.