sql >> Databáze >  >> RDS >> Mysql

Proč je IX-lock kompatibilní s jiným IX-lockem v InnoDB?

https://dev.mysql.com/doc /refman/5.6/en/innodb-lock-modes.html říká:

To znamená, že více vláken může získat IX zámky. Tyto zámky jsou na úrovni tabulky, nikoli na úrovni řádků. Zámek IX znamená, že vlákno, které jej drží, hodlá někde aktualizovat některé řádky ve stole. Zámky IX jsou určeny pouze k blokování operací s celou tabulkou.

Může to vrhnout určité světlo, pokud uvážíte, že to jde oběma směry -- pokud probíhá operace plné tabulky, pak má vlákno zámek na úrovni tabulky, který blokuje zámek IX.

Operace DML musí nejprve získat zámek IX, než se budou moci pokusit o zámky na úrovni řádků. Důvodem je, že nechcete, aby bylo povoleno DML při ALTER TABLE probíhá nebo když některé jiné vlákno provedlo LOCK TABLES...WRITE .

Změny na úrovni řádků jako UPDATE , DELETE , SELECT..FOR UPDATE nejsou blokovány zámkem IX. Jsou blokovány jinými změnami na úrovni řádků nebo skutečným zámkem celé tabulky (LOCK TABLES nebo určité příkazy DDL). Ale kromě těchto operací s tabulkami může více vláken s DML pravděpodobně pracovat současně, pokud každé z nich pracuje na sadě řádků, které se nepřekrývají.

K vašemu komentáři:

Druhý SELECT...FOR UPDATE není blokováno čekání na zámku IX, je blokováno čekání na zámcích X (úroveň řádku) na řádcích, které jsou již uzamčeny zámky X v jiném vláknu.

Právě jsem to zkusil a pak jsem spustil SHOW ENGINE INNODB STATUS takže jsem viděl zablokovanou transakci:

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

Vidět? Říká, že čeká na udělení zámku s lock_mode X na indexu primárního klíče tabulky test . To je zámek na úrovni řádku.

Máte zmatek ohledně LOCK IN SHARE MODE :

Mluvíte o třích úrovně SELECT .

  • SELECT nevyžaduje žádné zámky. Neblokují jej žádné zámky a neblokuje žádné jiné zámky.
  • SELECT ... LOCK IN SHARE MODE požaduje zámek IS na tabulce a poté se S uzamkne na řádcích, které odpovídají skenování indexu. Více vláken může držet zámky IS nebo zámky IX na stole. Více vláken může mít S zámky současně.
  • SELECT ... FOR UPDATE požaduje zámek IX na tabulce a poté uzamčení X na řádcích, které odpovídají skenování indexu. Zámky X jsou exkluzivní což znamená, že žádné jiné vlákno nemůže mít zámek X nebo zámek S ve stejné řadě.

Ale zámky X ani S se nezajímají o zámky IX nebo IS.

Přemýšlejte o této analogii:představte si muzeum.

Do muzea vstupuje mnoho lidí, návštěvníků i kurátorů. Návštěvníci si chtějí obrazy prohlédnout, a tak nosí odznak s nápisem „JE“. Kurátoři mohou obrazy nahrazovat, proto nosí odznak označený „IX“. V muzeu může být mnoho lidí současně, s oběma typy odznaků. Neblokují se navzájem.

Při své návštěvě se vážní příznivci umění dostanou k obrazu co nejblíže a budou jej dlouho studovat. Jsou rádi, že před stejným obrazem nechají vedle sebe stát další fandy umění. Proto dělají SELECT ... LOCK IN SHARE MODE a mají "S" zámky, protože alespoň nechtějí, aby byl obraz vyměněn, zatímco ho studují.

Kurátoři mohou nahradit obraz, ale jsou zdvořilí k vážným fanouškům umění a počkají, až tito diváci skončí, a půjdou dál. Snaží se tedy provést SELECT ... FOR UPDATE (nebo jednoduše UPDATE nebo DELETE ). V tuto chvíli získají "X" zámků zavěšením malého nápisu s nápisem "exhibit is redesigned." Vážní fanoušci umění chtějí vidět umění prezentované správným způsobem, s pěkným osvětlením a nějakou popisnou plaketou. Než se přiblíží, počkají na dokončení přepracování (pokud to zkusí, dostanou zámek.

Pravděpodobně jste také byli v muzeu, kde se potulují spíše náhodní návštěvníci a snaží se vyhýbat ostatním lidem. Dívají se na obrazy ze středu místnosti, nepřibližují se příliš blízko. Mohou se dívat na stejné obrazy, na které se dívají jiní diváci, a mohou nahlédnout přes ramena seriózním fanouškům umění, aby se také podívali na tyto obrazy. Mohou dokonce zírat na kurátory, když nahrazují obrazy (je jim jedno, jestli zahlédnou obraz, který ještě nebyl správně namontován a nasvícen). Takže tito náhodní návštěvníci nikoho neblokují a nikdo jim nebrání ve sledování. Právě dělají SELECT a nevyžadují žádné zámky.

Ale jsou tu i stavební dělníci, kteří mají bourat zdi a tak, ale nebudou pracovat, dokud v budově někdo je. Počkají, až všichni odejdou, a jakmile začnou svou práci, nikoho nepustí dovnitř. Tak přítomnost odznaků IS a IX blokuje DDL (stavební práce) a naopak.



  1. Výkonný způsob, jak vypsat cizí klíče pro tabulku MySQL?

  2. Omezení portu MySQL 3306 na localhost pomocí IPTABLES

  3. Kdy se plánují (SELECT) dotazy?

  4. Oracle získá čísla s rozsahem