Ти запитав
де зберігаються непослані дані, таким чином, що транзакція READ_UNCOMMITTED може читати невідомі дані з іншої транзакції?
Щоб відповісти на ваше запитання, вам потрібно знати, як виглядає архітектура InnoDB.
Наведена нижче картина була створена роками тому КТО Percona Вадимом Ткаченком
Відповідно до Документації MySQL про модель транзакцій та блокування InnoDB
COMMIT означає, що зміни, внесені в поточній транзакції, стають постійними та стають видимими для інших сесій. З іншого боку, оператор ROLLBACK скасовує всі зміни, внесені поточною транзакцією. І COMMIT, і ROLLBACK випускають усі блоки InnoDB, які були встановлені під час поточної транзакції.
Оскільки COMMIT і ROLLBACK регулюють видимість даних, ЧИТАТИ ЗВ'ЯЗАНО та ПРОЧИТАТИ НЕЗАКОМНОГО доведеться покладатися на структури та механізми, що фіксують зміни
- Відхилення сегментів / Скасування місця
- Повторити журнали
- Пропуски блокуються щодо залучених таблиць
Відчетні сегменти та скасувати пробіл знають, як виглядали змінилися дані до застосування змін. Redo Logs знає, які зміни потрібно просунути вперед, щоб дані з’явились.
Ви також запитували
чому не можливо для транзакції READ_COMMITTED зчитувати непідписані дані, тобто виконувати "брудне читання"? Який механізм застосовує це обмеження?
Повторюються журнали, скасувати пробіл та заблоковані рядки. Ви також повинні врахувати, що він InnoDB Buffer Pool (де ви можете вимірювати брудні сторінки за допомогою innodb_max_dirty_pages_pct , innodb_buffer_pool_pages_dirty та innodb_buffer_pool_bytes_dirty ).
Зважаючи на це, ЧИТАЙТЕ ЗНАЧЕНО, що дані з'являться назавжди. Тому не потрібно шукати брудні сторінки, які не були вчинені. ЧИТАЙТЕ ЗАПОВІДНО, це буде не що інше, як забруднене читання. ЧИТАЙТЕ НЕЗАКОМНО, і надалі знатимуть, які рядки мають бути заблоковані та які повторні журнали були прочитані чи проігноровані, щоб зробити дані видимими.
Щоб повністю зрозуміти блокування рядків для управління ізоляцією, будь ласка, прочитайте модель транзакцій InnoDB та блокування