Всичко зависи от НИВОТО НА ИЗОЛАЦИЯ
сте задали.
Можете да видите коя сте задали с тази заявка:
изберете @@global.tx_isolation, @@session.tx_isolation;
Преди да обясня различните нива на изолация, нека обясня кои проблеми се опитват да избегнат:
-
Мръсното четиво :Данните за все още незавършена транзакция се четат от друга транзакция.
-
Изгубената актуализация :Две транзакции паралелно променят запис в таблица. Когато и двете транзакции приключат, се прилага само една модификация.
-
Неповторяемото четене :Повторните четения водят до различни резултати.
-
Фантомното четене :По време на транзакция друга транзакция добавя или премахва записи в таблицата.
Сега за различните нива на изолация.
Четене без ангажимент :
С това ниво на изолация операциите за четене игнорират всякакъв вид заключвания, поради което може да възникне всеки от гореспоменатите проблеми.
Прочетете ангажимент :
Това ниво на изолация задава заключване на запис за цялата транзакция върху обекти, които трябва да бъдат променени. Заключването за четене се задава само при четене на данни. Следователно може да възникне неповторяемо четене и фантомно четене.
Повтарящо се четене :
С това ниво на изолация се гарантира, че повтарящите се операции за четене винаги дават същия резултат, когато параметрите са едни и същи. Заключването се задава за операции за четене и запис за цялата продължителност на транзакцията. Следователно могат да се осъществят само фантомни четения.
Може да се сериализира :
Най-високото ниво на изолация гарантира, че резултатът от паралелно изпълнявани транзакции е същият, както ако транзакциите ще се изпълняват една след друга. Повечето бази данни всъщност не изпълняват тези транзакции една след друга, това би било твърде голяма загуба на производителност. Следователно може да се случи една транзакция да бъде прекъсната. MySQL например реализира това с MVCC (Multi-Version Concurrency Control). Google го, ако искате да знаете повече. Това е твърде много за този отговор.
Като цяло тази таблица също го обяснява:
<предварителен код> | Загубени актуализации | Мръсно четене | Неповторяемо четене | Фантомно четене------------------------------------------------ ---------------------------------Четене без ангажимент | възможно | възможно | възможно | възможно Прочетете Извършено | невъзможно | невъзможно | възможно | възможно Повторяемо четене | невъзможно | невъзможно | невъзможно | възможноСериализиращ се | невъзможно | невъзможно | невъзможно | невъзможно- В този ръчно въвеждане е малко повече информация за него и как да настроите нивото на изолация.
Всичко това е само теория за системите за управление на релационни бази данни. Тъй като MySQL използва MVCC (контрол на паралелност с няколко версии) обаче, не се случват фантомни четения при използване на InnoDB и ниво на изолация на повтарящо се четене .
От ръчно
: