Първо, блокиранията не зависят от изрично заключване. НЕ се изисква LOCK TABLE на MySQL или използването на режими на изолация на транзакции, които не са по подразбиране, за да има блокиране. Все още можете да имате блокиране, ако никога не използвате изрична транзакция.
Застой може да се случи на една маса, доста лесно. Най-често е от една гореща маса.
Застой може дори се случва, ако всичките ви транзакции извършват само вмъкване на един ред.
Може да възникне задънена улица, ако имате
- Повече от една връзка към базата данни (очевидно)
- Всяка операция, която вътрешно включва повече от едно заключване.
Това, което не е очевидно, е, че през повечето време едно вмъкване на един ред или актуализация включва повече от едно заключване. Причината за това е, че вторичните индекси също трябва да бъдат заключени по време на вмъквания/актуализации.
SELECT няма да се заключват (ако приемем, че използвате режима на изолация по подразбиране и не използвате FOR UPDATE), така че те не могат да бъдат причината.
SHOW ENGINE INNODB STATUS е ваш приятел. Това ще ви даде куп (признано много объркваща) информация относно блокирането, по-специално най-новата.
- Не можете напълно да премахнете блокиранията, те ще продължат да се случват в производството (дори на тестови системи, ако ги стресирате правилно)
- Стремете се към много малък брой блокирания. Ако 1% от транзакциите ви блокират, това вероятно е твърде много.
- Помислете за промяна на нивото на изолация на транзакциите на вашите транзакции на четене с ангажимент, АКО РАЗБИРАТЕ НАПЪЛНО ПОСЛЕДСТВИЯТА
- уверете се, че вашият софтуер се справя по подходящ начин със застой.