Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Deadlock, jak to zrobić???
espeen
post 19.01.2006, 21:31:34
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 5.01.2006
Skąd: Kraków

Ostrzeżenie: (10%)
X----


Witam.
Potrzebuję kilka przykładów jak wywołać taki błąd w mysql?questionmark.gif
Pilne.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
DeyV
post 19.01.2006, 22:54:12
Post #2





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
DeyV
post 20.01.2006, 12:27:41
Post #3





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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”…


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
espeen
post 20.01.2006, 13:36:36
Post #4





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 5.01.2006
Skąd: Kraków

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
Radarek
post 20.01.2006, 14:33:02
Post #5





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mike
post 20.01.2006, 15:12:15
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Radarek
post 20.01.2006, 17:50:42
Post #7





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Radarek 20.01.2006, 19:50:41
Go to the top of the page
+Quote Post
SongoQ
post 20.01.2006, 19:24:13
Post #8





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%)
-----


@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.


--------------------
Go to the top of the page
+Quote Post
espeen
post 21.01.2006, 17:03:20
Post #9





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 5.01.2006
Skąd: Kraków

Ostrzeżenie: (10%)
X----


Spoko.
Fajne przykłady oto mi mniej wiecej chodzi. Czekam na więcej smile.gif
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: 21.06.2025 - 17:29