2014-09-18 15 views
5

Według innodb lock modeblokady kompatybilności typ matrycyDlaczego IX-lock jest zgodny z innym IX-lock w InnoDB?

X   IX   S   IS 
X Conflict Conflict Conflict Conflict 
IX Conflict Compatible Conflict Compatible 
S Conflict Conflict Compatible Compatible 
IS Conflict Compatible Compatible Compatible 

IX jest kompatybilny z IX, ale faktem jest, jeśli możemy nabyć jedną blokadę IX select c1 from z where c1 = 1 for update w sesji 1, starając się nabyć IX select c1 from z where c1 = 1 for update zostaną zablokowane sesja 2, więc myślę, że nie są kompatybilne. Czy tęskniłem za czymkolwiek tutaj?

Edit po odpowiedź zaakceptowana:

Powodem SELECT ... FOR UPDATE w jednym bloków sesji SELECT ... FOR UPDATE w inny jest proszą nie tylko IX zablokować na poziomie tabeli, ale również na X zamknij poziom wiersza. To wszystko z powodu blokady X.

Odpowiedz

10

https://dev.mysql.com/doc/refman/5.6/en/innodb-lock-modes.html mówi:

Zatem, zamki intencją nie wiem nic oprócz pełnych wniosków tabeli (na przykład stoły LOCK ... Write) zablokować. Głównym celem blokad IX i IS jest pokazanie, że ktoś blokuje wiersz lub blokuje wiersz w tabeli.

Oznacza to, że wiele wątków może uzyskać IX blokady. Te blokady są na poziomie stołu, a nie na poziomie wiersza. Blokada IX oznacza, że ​​wątek holding zamierza zaktualizować niektóre wiersze gdzieś w tabeli. IX zamki są przeznaczone tylko do blokowania operacji pełnoekranowych.

To może rzucić trochę światła, jeśli uważasz, że idzie w obie strony - jeśli operacja pełnego stołu jest w toku, to ten wątek ma blokadę na poziomie stołu, która blokuje blokadę IX.

operacje DML musi najpierw nabyć zamka IX zanim próbie blokady rząd poziomu. Powodem jest to, że nie chcesz być DML wolno natomiast ALTER TABLE jest w toku, lub gdy jakiś inny wątek zrobił LOCK TABLES...WRITE.

Zmiany na poziomie wiersza, takie jak UPDATE, DELETE, SELECT..FOR UPDATE, nie są blokowane przez blokadę IX. Są blokowane przez inne zmiany na poziomie wiersza lub przez faktyczną pełną blokadę tabeli (LOCK TABLES lub niektóre instrukcje DDL). Ale oprócz tych operacji na tabelach, wiele wątków z DML może pracować równolegle, o ile pracują one nad zestawem wierszy, które się nie nakładają.


Re swój komentarz:

Drugi SELECT...FOR UPDATE nie jest zablokowany czekając na zamek IX, to zablokowane czeka na X (na poziomie wiersza) blokuje w wierszach, które są już zablokowane przez X-zamki w kolejny wątek.

prostu próbowałem to i wtedy wpadłem SHOW ENGINE INNODB STATUS więc mogłem zobaczyć zablokowany transakcji:

---TRANSACTION 71568, ACTIVE 12 sec starting index read 
mysql tables in use 1, locked 1 
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s) 
MySQL thread id 10, OS thread handle 140168480220928, query id 288 localhost root statistics 
select * from test where id=1 for update 
------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 802 page no 3 n bits 72 index `PRIMARY` of table `test`.`test` 
trx id 71568 lock_mode X locks rec but not gap waiting 

zobaczyć? Mówi, że czeka na które mają zostać przyznane z lock_mode blokadę X na indeksie klucz podstawowy stołu test. To blokada na poziomie rzędu.


Re swojej zamieszania o LOCK IN SHARE MODE:

mówisz trzy poziomy SELECT.

  • SELECT nie żąda zamków. Żadne blokady nie blokują go i nie blokuje żadnych innych zamków.
  • żąda blokady IS w tabeli, a następnie S blokuje wiersze pasujące do indeksu. Wiele wątków może przechowywać blokady IS lub IX blokady na stole. Wiele wątków może jednocześnie blokować S.
  • SELECT ... FOR UPDATE żąda blokady IX dla tabeli, a następnie X blokuje wiersze pasujące do indeksu. X zamki są wyłączne, co oznacza, że ​​żaden inny wątek nie może mieć blokady X lub blokady S w tym samym rzędzie.

Ale żadne zamki X ani S nie dbają o zamki IX lub IS.

Pomyśl o tej analogii: wyobraź sobie muzeum.

Wiele osób, zarówno odwiedzających, jak i kuratorów, wchodzi do muzeum. Odwiedzający chcą oglądać obrazy, więc noszą plakietkę z napisem "IS". Kuratorzy mogą zastępować obrazy, więc noszą znaczek oznaczony "IX". W muzeum może być jednocześnie wiele osób posiadających oba rodzaje odznak. Nie blokują się nawzajem.

Podczas swojej wizyty poważni fani sztuki będą mogli zbliżyć się do obrazu tak, jak tylko mogą, i uczyć się przez dłuższy czas. Chętnie pozwolą innym fanom sztuki stać obok nich przed tym samym obrazem. Dlatego robią SELECT ... LOCK IN SHARE MODE i mają zamki "S", ponieważ przynajmniej nie chcą, aby obraz został zastąpiony podczas ich studiowania.

Kuratorzy mogą zamienić obraz, ale są uprzejmi dla poważnych fanów sztuki i będą czekać, aż ci widzowie się skończą i ruszą dalej. Więc próbują zrobić SELECT ... FOR UPDATE (lub po prostu UPDATE lub DELETE). W tym czasie zdobędą zamki "X", zawieszając małą rejestrację, mówiąc: "Przeprojektowano wystawę". Poważni fani sztuki chcą widzieć sztukę prezentowaną w odpowiedni sposób, z ładnym oświetleniem i jakimś opisowym plackiem. Będą czekać na przeprojektowanie, zanim się zbliży (będą czekać na blokadę, jeśli spróbują).

Prawdopodobnie byłeś też w muzeum, w którym wędrują bardziej swobodni goście, starając się trzymać z dala od ludzi. Patrzą na obrazy ze środka pokoju, nie podchodząc zbyt blisko. Mogą spojrzeć na te same obrazy, na które patrzą inni widzowie, i mogą zerknąć na barki poważnych fanów sztuki, patrzeć na obrazy, które są oglądane. Mogą nawet gapić się na kuratorów, gdy zastępują obrazy (nie obchodzi ich, czy widzą obraz, który jeszcze nie został prawidłowo zamontowany i oświetlony). Więc ci przypadkowi goście nie blokują nikogo i nikt nie blokuje ich oglądania. Po prostu robią SELECT i nie żądają żadnych zamków.

Ale są też pracownicy budowlani, którzy mają zburzyć mury i takie tam, ale nie będą działać, dopóki w budynku nie będzie nikogo. Poczekają, aż wszyscy wyjdą, a kiedy zaczną pracę, nie wpuszczą nikogo. W ten sposób obecność identyfikatorów IS i IX blokuje DDL (prace budowlane) i na odwrót.

+0

Witaj Bill, Mówiąc "WYBIERZ ... DLA AKTUALIZACJI nie są blokowane przez blokadę IX", to jak wyjaśnić WYBIERZ ... DLA AKTUALIZACJI został zablokowany przez inny WYBIERZ ... DLA AKTUALIZACJI, który rzeczywiście jest IX blokada – hylepo

+0

Imponujące, czekał na blokadę X, ale kto ustawił X na tym? WYBIERZ ... DO AKTUALIZACJI zapytał się tylko o zamek IX? – hylepo

+0

Nie - "WYBIERZ ... DLA AKTUALIZACJI" blokuje wiersze, które są odczytywane przez skanowanie indeksu, tak samo, jak gdybyś zrobił polecenie 'UPDATE' lub' DELETE' w tych wierszach. Zobacz https://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html Dlatego 'SELECT ... FOR UPDATE' próbuje utworzyć blokady X i jest zablokowany, jeśli inne blokady X już istnieją w tych rzędach. Jeśli zdobędzie blokady, blokuje inne instrukcje 'SELECT ... FOR UPDATE', które odczytują te same wiersze. –

0

Zamki IS i IX umożliwiają dostęp wielu klientom. Niekoniecznie będą się one kłócić, dopóki nie spróbują uzyskać prawdziwych zamków w tych samych rzędach.

Ale blokada stołu (ALTER TABLE, DROP TABLE, LOCK TABLES) blokuje zarówno IS, jak i IX, i na odwrót.

Dlatego IX blokady kompatybilny z innymi IX blokady (oba mają poziom stołu) lub konfliktu IX-blokującego z inną X zamka (poziom tabela nie Rów poziom)

odniesienia: http://www.slideshare.net/billkarwin/innodb-locking-explained-with-stick-figures

Powiązane problemy