Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо IX-заключване е съвместимо с друго IX-заключване в InnoDB?

https://dev.mysql.com/doc /refman/5.6/en/innodb-lock-modes.html казва:

Това означава, че множество нишки могат да придобият IX заключвания. Тези заключвания са на ниво таблица, а не на ниво ред. IX заключване означава, че нишката, която го държи, възнамерява да актуализира някои редове някъде на масата. IX заключванията са предназначени само за блокиране на операции на цялата маса.

Може да хвърли малко светлина, ако вземете предвид, че върви и в двете посоки -- ако е в ход операция на цяла таблица, тогава тази нишка има заключване на ниво таблица, което блокира IX заключване.

DML операциите трябва първо да получат IX заключване, преди да могат да опитат заключване на ниво ред. Причината е, че не искате DML да бъде разрешен, докато ALTER TABLE е в ход или докато друга нишка е извършила LOCK TABLES...WRITE .

Промени на ниво ред като UPDATE , DELETE , SELECT..FOR UPDATE не са блокирани от IX заключване. Те са блокирани от други промени на ниво ред или от действително пълно заключване на таблица (LOCK TABLES , или определени DDL изрази). Но освен тези таблични операции, множество нишки, изпълняващи DML, вероятно могат да работят едновременно, стига всеки да работи върху набор от редове, които не се припокриват.

Re your comment:

Вторият SELECT...FOR UPDATE не е блокиран в очакване на заключването IX, блокиран е в очакване на заключванията X (ниво на ред) на редове, които вече са заключени от X-ключалки в друга нишка.

Току-що опитах това и след това стартирах SHOW ENGINE INNODB STATUS за да мога да видя блокираната транзакция:

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

виждаш ли Казва, че чака да му бъде разрешено заключването с lock_mode X в индекса на първичен ключ на таблицата test . Това е заключване на ниво ред.

Повторете вашето объркване относно LOCK IN SHARE MODE :

Говорите за три нива на SELECT .

  • SELECT изисква без ключалки. Никакви ключалки не го блокират и той не блокира други ключалки.
  • SELECT ... LOCK IN SHARE MODE изисква IS заключване на таблицата и след това S заключва редове, които съответстват на сканирането на индекса. Множество нишки могат да държат IS ключалки или IX ключалки на таблица. Няколко нишки могат да държат S ключалки едновременно.
  • SELECT ... FOR UPDATE изисква IX заключване на таблицата и след това X заключва редове, които съответстват на сканирането на индекса. X бравите са изключителни което означава, че не могат никоя друга нишка да има X lock или S заключване на същия ред.

Но нито X, нито S заключванията се интересуват от IX или IS заключванията.

Помислете за тази аналогия:представете си музей.

В музея влизат много хора, както посетители, така и уредници. Посетителите искат да гледат картини, затова носят значка с надпис „IS“. Кураторите могат да заменят картини, така че те носят значка с надпис "IX". В музея може да има много хора едновременно и с двата вида значки. Те не се блокират един друг.

По време на посещението си, сериозните почитатели на изкуството ще се доближат възможно най-близо до картината и ще я изучават продължително време. Те са щастливи да позволят на други фенове на изкуството да застанат до тях пред същата картина. Следователно те правят SELECT ... LOCK IN SHARE MODE и имат "S" брави, защото поне не искат картината да бъде заменена, докато я изучават.

Кураторите могат да заменят картина, но те са учтиви към сериозните фенове на изкуството и ще изчакат, докато тези зрители свършат, и ще продължат напред. Така че те се опитват да направят SELECT ... FOR UPDATE (или просто UPDATE или DELETE ). Те ще придобият ключалки „X“ по това време, като закачат малък знак с надпис „изложбата се преработва“. Сериозните фенове на изкуството искат да видят изкуството, представено по подходящ начин, с хубаво осветление и някаква описателна плоча. Те ще изчакат да бъде направен редизайнът, преди да се приближат (те получават изчакване за заключване, ако опитат).

Освен това сигурно сте били в музей, където по-случайните посетители се разхождат, опитвайки се да стоят далеч от пътя на другите. Те гледат картини от средата на стаята, без да се приближават твърде близо. Те могат да гледат същите картини, които другите зрители гледат, и могат да надникнат през раменете на сериозните фенове на изкуството, за да разгледат и тези картини, които се разглеждат. Те дори могат да зяпат кураторите, докато сменят картини (не им пука, ако зърнат картина, която все още не е монтирана и осветена правилно). Така че тези случайни посетители не блокират никого и никой не блокира тяхното гледане. Те просто правят SELECT и те не изискват никакво заключване.

Но има и строителни работници, които трябва да събарят стени и други неща, но няма да работят, докато има някой в ​​сградата. Те ще изчакат всички да си тръгнат и след като започнат работата си, няма да пуснат никого вътре. Ето как наличието на значки IS и IX блокира DDL (строителните работи) и обратното.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да постигнем стойност по подразбиране, ако стойността на колоната е NULL?

  2. Генерирайте произволна LocalDate с java.time

  3. Как да премахнете дублиращото се изчисление в SQL?

  4. Инсталиране на magento, получаване на грешка при връзката с базата данни.

  5. Проверка на наличността на потребителско име на PHP PDO