Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego IX-lock jest kompatybilny z innym IX-lock w InnoDB?

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

Oznacza to, że wiele wątków może uzyskać blokady IX. Te blokady znajdują się na poziomie tabeli, a nie na poziomie wiersza. Blokada IX oznacza, że ​​wątek ją trzymający zamierza zaktualizować niektóre wiersze gdzieś na stole. Blokady IX są przeznaczone tylko do blokowania operacji na pełnej tabeli.

Może to rzucić trochę światła, jeśli weźmiesz pod uwagę, że działa to w obie strony - jeśli trwa operacja na pełnej tabeli, wątek ma blokadę na poziomie tabeli, która blokuje blokadę IX.

Operacje DML muszą najpierw uzyskać blokadę IX, zanim będą mogły spróbować blokad na poziomie wiersza. Powodem jest to, że nie chcesz, aby DML było dozwolone podczas ALTER TABLE jest w toku lub gdy inny wątek wykonał LOCK TABLES...WRITE .

Zmiany na poziomie wiersza, takie jak UPDATE , DELETE , SELECT..FOR UPDATE nie są blokowane przez zamek IX. Są blokowane przez inne zmiany na poziomie wiersza lub przez rzeczywistą blokadę pełnej tabeli (LOCK TABLES lub niektórych instrukcji DDL). Ale oprócz tych operacji na tabelach, wiele wątków obsługujących DML prawdopodobnie może działać jednocześnie, o ile każdy z nich pracuje na zestawie wierszy, które się nie nakładają.

Odpowiedz na swój komentarz:

Drugi SELECT...FOR UPDATE nie jest blokowany w oczekiwaniu na blokadę IX, jest blokowany w oczekiwaniu na blokadę X (poziom wiersza) w wierszach, które są już zablokowane przez blokady X w innym wątku.

Właśnie tego spróbowałem, a potem uruchomiłem SHOW ENGINE INNODB STATUS żebym mógł zobaczyć zablokowaną transakcję:

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

Widzieć? Mówi, że czeka na przyznanie blokady za pomocą lock_mode X w indeksie klucza podstawowego tabeli test . To jest blokada na poziomie rzędu.

Czy masz wątpliwości co do LOCK IN SHARE MODE :

Mówisz o trzech poziomy SELECT .

  • SELECT żąda żadnych blokad. Żadne blokady go nie blokują i nie blokuje innych blokad.
  • SELECT ... LOCK IN SHARE MODE żąda blokady IS w tabeli, a następnie S blokuje wiersze, które pasują do skanowania indeksu. Wiele wątków może przechowywać blokady IS lub blokady IX w tabeli. Wiele wątków może jednocześnie trzymać blokady S.
  • SELECT ... FOR UPDATE żąda IX blokady tabeli, a następnie X blokuje wiersze, które pasują do skanowania indeksu. X blokady są wyłączne co oznacza, że ​​żaden inny wątek nie może mieć blokady X lub blokada S w tym samym rzędzie.

Ale ani blokady X, ani S nie dbają o blokady IX ani IS.

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

Do muzeum wchodzi wiele osób, zarówno zwiedzających, jak i kuratorów. Zwiedzający chcą oglądać obrazy, dlatego noszą odznakę z napisem „IS”. Kuratorzy mogą zastępować obrazy, dlatego noszą odznakę z napisem „IX”. W muzeum może przebywać jednocześnie wiele osób z obydwoma rodzajami odznak. Nie blokują się nawzajem.

Podczas wizyty poważni miłośnicy sztuki zbliżą się do obrazu tak blisko, jak tylko mogą i będą go studiować przez dłuższy czas. Cieszą się, że inni miłośnicy sztuki mogą stanąć obok nich przed tym samym obrazem. Dlatego robią SELECT ... LOCK IN SHARE MODE i mają zamki "S", ponieważ przynajmniej nie chcą, aby obraz był wymieniany podczas nauki.

Kuratorzy mogą zastąpić obraz, ale są uprzejmi dla poważnych fanów sztuki i poczekają, aż ci widzowie skończą i pójdą dalej. Więc próbują wykonać SELECT ... FOR UPDATE (lub po prostu UPDATE lub DELETE ). W tym czasie zdobędą zamki „X”, zawieszając małą tabliczkę z napisem „Przeprojektowano eksponat”. Poważni miłośnicy sztuki chcą, aby sztuka została przedstawiona we właściwy sposób, z ładnym oświetleniem i opisową tabliczką. Będą czekać na przeprojektowanie, zanim się zbliżą (otrzymują blokadę, jeśli spróbują).

Ponadto prawdopodobnie byłeś w muzeum, w którym wędrują bardziej przypadkowi goście, próbując trzymać się z dala od innych ludzi. Patrzą na obrazy ze środka pokoju, nie podchodząc zbyt blisko. Mogą patrzeć na te same obrazy, na które patrzą inni widzowie, i mogą zaglądać przez ramiona poważnych fanów sztuki, aby spojrzeć na te obrazy, które są oglądane. Mogą nawet gapić się na kuratorów, gdy wymieniają obrazy (nie obchodzi ich, czy widzą obraz, który nie został jeszcze odpowiednio zamontowany i oświetlony). Tak więc ci przypadkowi goście nie blokują nikogo i nikt nie blokuje ich oglądania. Po prostu robią SELECT i nie proszą o żadne blokady.

Ale są też robotnicy budowlani, którzy mają zburzyć ściany i takie tam, ale nie będą pracować, dopóki ktoś jest w budynku. Będą czekać, aż wszyscy wyjdą, a kiedy rozpoczną pracę, nikogo nie wpuszczą. W ten sposób obecność identyfikatorów IS i IX blokuje DDL (prace budowlane) i vice versa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Napraw za pomocą gdzie; Korzystanie tymczasowe; Korzystanie z sortowania plików

  2. Nie można wstawić wartości, jaka jest - potrzebuję odpowiedzi dla dowolnej bazy danych - Oracle, Sql Server, MySql itp.

  3. Błąd składni MySQL, nierozpoznane słowo kluczowe null

  4. Jak przesunąć wartości kolumn w MySQL?

  5. RegEx z preg_match, aby znaleźć i zamienić PODOBNY ciąg