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

Разбиране на детайлността на заключване в MySQL

Ако сте работили с MySQL от известно време, вероятно сте чували термините „заключване на ниво таблица“ и „заключване на ниво ред“. Тези термини се отнасят до детайлността на заключването в MySQL – в този блог ще обясним какво означават и за какво могат да се използват.

Какво е детайлност на заключване в MySQL?

Всяка система за съхранение на MySQL поддържа различни нива на детайлност за своите ключалки. MySQL има три нива на заключване:заключване на ниво ред, заключване на ниво страница и заключване на ниво таблица. Всяка система за съхранение на MySQL изпълнява заключването по различен начин, което ви дава някои отделни предимства и недостатъци. Първо ще разгледаме каква е детайлността на заключването, след което ще разгледаме как работи всичко в различните механизми за съхранение.

Най-общо казано, ключалките в MySQL попадат в една от тези категории. Ключалките могат да бъдат:

  • Ниво на страница – такива типове детайли за заключване са били налични в по-старите двигатели на MySQL, по-специално BDB, който е вече остарял от MySQL 5.1. Накратко, BDB беше машина за съхранение, включена в по-старите версии на MySQL и беше транзакционна машина за съхранение, която изпълняваше заключвания на ниво страница. Тъй като тези типове детайли на заключване вече не се използват, няма да ги разглеждаме в дълбочина тук, но като цяло тези заключване са ограничени до данните и индексите, които се намират на конкретна страница. Ако искате да научите повече за BDB, страницата на MariaDB трябва да предостави малко повече информация.

  • Ниво на таблица – MySQL използва заключване на ниво таблица за всички машини за съхранение с изключение на InnoDB.

  • Ниво на ред – заключването на ниво ред се използва от InnoDB.

Предимствата и недостатъците на заключването на ниво таблица

MySQL използва заключване на ниво таблица за всички машини за съхранение с изключение на InnoDB, което означава, че заключването на ниво таблица се използва за таблици, работещи с MyISAM, MEMORY и MERGE механизмите за съхранение, което позволява само една сесия за актуализиране на таблици в даден момент . Заключването на ниво таблица има някои отчетливи предимства пред заключването на ниво ред (например заключването на ниво таблица като цяло изисква малко по-малко памет от заключването на ниво ред, тъй като заключването на ниво ред изисква известна памет на ред (или група) от редовете които са заключени и обикновено е бързо, защото е включено само едно заключване. Заключванията за запис на таблица се поставят на таблица, ако няма заключвания върху нея - ако има вече съществуващи заключвания на въпросната таблица, заявките за заключване на таблицата се поставят в опашката със заявки за четене. Струва си да се спомене, че заключването на ниво таблица има и някои уникални недостатъци – например може да не е много подходящо за приложения, които изискват много транзакции, които вървят „назад-назад” (напр. , приложение за онлайн банкиране), тъй като само една сесия може да записва в таблица по всяко време и някои от таблиците, които поддържат заключване на ниво таблица (като MyISAM), не поддържат модела ACID.

Ето един пример:представете си приложение за банкиране, което използва две таблици в база данни – да кажем, че тези таблици се наричат ​​„чекиране“ и „спестяване“. Трябва да преместите $100 от разплащателна сметка на човек в неговата спестовна сметка. Логично ще изпълните следните стъпки:

  1. Уверете се, че салдото по сметката е по-голямо от $100.

  2. Извадете $100 от разплащателната сметка.

  3. Добавете $100 към спестовната сметка.

За да извършите тези действия, ще ви трябват няколко заявки, например:

SELECT balance FROM checking WHERE account_id = 123;
UPDATE checking SET balance = balance - 100 WHERE account_id = 123;
UPDATE savings SET balance = balance + 100 WHERE account_id = 123;

Тези заявки може да изглеждат прости, но ако използвате MyISAM (използваме MyISAM като пример, тъй като това е една от основните системи за съхранение, която поддържа заключвания на ниво таблица), трябва да сте запознати с факта, че двигателят също не поддържа ACID, което означава, че ако сървърът на базата данни се срине при изпълнение на някоя от тези заявки, нямате късмет:хората могат да получат пари в двете сметки или в нито една от тях. Единственият двигател, който поддържа ACID-базирани транзакции в MySQL, е InnoDB, така че ако имате нужда от много надеждни транзакции, може да си струва да го разгледате. InnoDB също така поддържа заключване на ниво ред - това е, което ще разгледаме сега.

Предимствата и недостатъците на заключването на ниво ред

MySQL използва заключване на ниво ред за таблици InnoDB, за да поддържа едновременен достъп за запис от множество сесии. Някои от предимствата на използването на заключване на ниво ред включват възможността за заключване на един ред за дълги периоди от време и по-малко конфликти при заключване, когато много нишки имат достъп до различни редове. Заключването на ниво ред обаче има и недостатъци:един от тях е, че заключването на ниво ред обикновено заема повече памет от заключването на ниво страница или таблица, също така обикновено е по-бавно от заключването на ниво страница или таблица, тъй като механизмът трябва да придобие повече ключалки. InnoDB е един от двигателите, който поддържа механизъм за заключване на ниво ред:той също е съвместим с ACID, което означава, че е подходящ за приложения, базирани на транзакции (вижте примера по-горе). Сега ще разгледаме как работи детайлността на заключването в една от MySQL системи за съхранение.

Как работи детайлността на заключването в InnoDB?

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

InnoDB има и други типове заключване – някои от тях включват споделени и изключителни заключвания, заключвания за намерение, заключвания на запис, заключване на пропуски, заключвания на следващия ключ и заключвания за следващо намерение. Заключванията за намерение, например, също могат да бъдат споделени или изключителни - такива заключвания обикновено показват, че дадена транзакция възнамерява да зададе определен тип заключване (споделено заключване или изключително заключване) на отделни редове в таблица, заключването на запис е заключване на индексен запис и др.

По принцип детайлността на заключване на InnoDB се различава от детайлността на заключване, присъстваща в други системи за съхранение на MySQL (например MyISAM), тъй като когато се използва заключване на ниво таблица, само една сесия за актуализиране на определени таблици в времето може да тече. Когато се използва заключване на ниво ред, MySQL поддържа едновременен достъп за запис в множество сесии, което прави механизмите за съхранение на ниво ред (InnoDB) подходящ избор за критични приложения.

Заключване на детайлност и блокиране

Драйналността на заключване и нивата на заключване в MySQL могат да бъдат страхотно нещо, но също така могат да причинят проблеми. Един от най-често срещаните проблеми, причинени от детайлността на заключването, са блокирането - блокиране възниква, когато различни MySQL транзакции не могат да продължат, тъй като всяка от тях притежава заключване, от което се нуждае другата. За щастие, когато използвате механизма за съхранение на InnoDB, откриването на блокиране е активирано по подразбиране - когато се открие блокиране, InnoDB автоматично връща обратно транзакция. Ако срещнете блокиране, когато се справяте с детайлността на заключването в MySQL, не се притеснявайте - помислете просто за рестартиране на транзакцията си. За да наблюдавате проактивно вашата база данни, трябва също да помислите за използването на функциите, предоставени от ClusterControl.

Как може ClusterControl да ви помогне?

Ето някои от нещата, с които ClusterControl, разработен от Severalnines, може да ви помогне:

  • Защитата на всичките ви бизнес данни

    • Ако данните ви са повредени (това може да бъде причинено от неизползване на ACID-съвместим механизъм за съхранение или също от други фактори, както е описано по-горе) инструментът може да стартира автоматичен процес, който действително потвърждава, че можете да възстановите данните си.

    • Инструментът може да ви уведоми кои бази данни не са архивирани или да ви покаже състоянието на вашите резервни копия (независимо дали те са били успешни или са се провалили)

  • Автоматизирането на операциите с вашата база данни

    • ClusterControl може да ви помогне да гарантирате, че вашите системни администратори, разработчици и DBA управляват ефективно цели клъстери от бази данни с минимални рискове, използвайки индустрията най-добри практики

  • Ефективно управление на вашата инфраструктура на база данни като цяло

    • Днешната промяна в технологиите, съчетана със сложни инфраструктурни решения, изисква усъвършенствани инструменти и знания за постигане на висока наличност и оптимална производителност за вашите критични за бизнеса приложения. ClusterControl може също да ви помогне с внедряването, наблюдението, управлението и мащабирането на най-популярните технологии за бази данни с отворен код, включително MySQL, MariaDB, MongoDB, PostgreSQL, TimeScaleDB и останалите.

За да научите повече за това как ClusterControl може да помогне за рационализиране на вашите бизнес операции, не забравяйте да следите блога на базата данни на Severalnines.

Резюме

Различните системи за съхранение на MySQL имат различни видове детайли за заключване. Преди да вземете решение за машината за съхранение, която трябва да използвате, уверете се, че знаете възможно най-много информация за въпросната машина за съхранение (например, както вече беше отбелязано, MyISAM трябва да се избягва, когато работите с критични данни, тъй като не е съвместим с ACID), разберете всички свързани последици за производителността, включително детайлност на заключването, блокиране и останало и избирайте разумно.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB низови функции (пълен списък)

  2. Автоматизирайте проверка на обекта на схемата на базата данни

  3. MariaDB LAST_INSERT_ID() Обяснено

  4. Как DATE_FORMAT() работи в MariaDB

  5. MariaDB LOCALTIMESTAMP() Обяснено