Mysql 7
7.5.8. Транзакційна модель InnoDB
Призначення транзакционной моделі InnoDB полягає в тому, щоб поєднати кращі властивості різноманітної бази даних і традиційної двухфазной блокування. Для таблиць InnoDB здійснюється блокування на рівні рядка і запити за замовчуванням запускаються як цілісне зчитування без блокувань, подібно до того, як це реалізовано в Oracle. Зберігання таблиці блокувань InnoDB організовано настільки економічно, що немає необхідності в розширенні блокування: зазвичай кілька користувачів можуть блокувати будь-який рядок або будь-який набір рядків в базі даних, не займаючи всю пам'ять, доступну для InnoDB.
У таблицях InnoDB всі дії користувачів здійснюються за допомогою транзакцій. Якщо в MySQL використовується режим автоматичної фіксації, то для кожного оператора SQL буде створюватися окрема транзакція. MySQL завжди відкриває нове з'єднання з включеним режимом автоматичної фіксації.
Якщо режим автоматичної фіксації відключений за допомогою SET AUTOCOMMIT = 0. то ми припускаємо, що у користувача завжди є відкрита транзакція. Якщо він виконує оператор SQL COMMIT або ROLLBACK. які завершують поточну транзакцію, відразу ж запускається нова транзакція. Обидва згаданих оператора знімають всі блокування InnoDB, які були встановлені під час виконання поточної транзакції. Оператор COMMIT означає, що зміни, внесені під час виконання поточної транзакції, приймаються і стають видимими для інших користувачів. Оператор ROLLBACK скасовує всі зміни, внесені поточної транзакцією.
Якщо в з'єднанні встановлено AUTOCOMMIT = 1. то користувач, тим не менш, може використовувати транзакції, починаючи їх з BEGIN і закінчуючи за допомогою COMMIT або ROLLBACK.
Користувач може змінити рівень ізоляції для окремо взятої сесії або нового з'єднання таким чином:
Зверніть увагу що назви рівнів ізоляції пишеться без дефісу в SQL-вираженні. Якщо ви вказали ключове слово GLOBAL в зазначеному вище вираженні, воно буде визначати рівень ізоляції для нових з'єднань, але не матиме ефекту для старих з'єднань. Будь-який користувач може змінити рівень ізоляції для своєї сесії, навіть всередині самої транзакції. У версіях старше 3.23.50 SET TRANSACTION не діє на таблиці InnoDB. У версіях старше 4.0.5 ви можете використовувати тільки REPEATABLE READ і SERIALIZABLE.
Ви можете отримати інформацію про рівень ізоляції, глобальному або для поточного з'єднання:
У блокуванні рівня рядка InnoDB використовує так звану блокування наступного ключа. Це означає, що крім індексних записів InnoDB може також блокує "інтервал" перед індексного записом для блокування вставок іншими користувачами безпосередньо перед індексного записом. Блокування наступного ключа означає блокування, яке ставиться на індексну запис і інтервал перед нею. Блокування інтервалу означає тільки блокування інтервалу перед деякими індексними записами.
Детальний опис кожного рівня ізоляції в InnoDB:
READ UNCOMMITTED Також називається "брудним читанням": неблокірующіх вибірки (SELECT) виконуються таким чином, що ми не бачимо можливі ранні версії запису; таким чином вони "неузгоджено" Новомосковскются в цьому рівні ізоляції; в інших випадках цей рівень працює також як і READ COMMITTED.
READ COMMITTED Щось схоже на рівень ізоляції Oracle. Всі вирази SELECT. FOR UPDATE і SELECT. LOCK IN SHARE MODE блокують тільки індексні записи і не блокують інтервал перед ними. Тому вони дозволяють вільно додавати нові записи після заблокованих. UPDATE і DELETE. які використовують унікальний індекс і унікальні умови пошуку, блокують тільки знайдену індексний запис, і не блокують інтервал перед нею. Але в UPDATE і DELETE діапазонного типу в InnoDB повинні встановити блокування наступного ключа або интервальную блокування і блокувати додавання іншими користувачами в інтервал, покритий діапазоном. Це необхідно, тому що "Фантомні рядки" повинні бути блоковані для успішної роботи реплікації і відновлення в MySQL. Узгоджене читання працює як і в Oracle: кожне узгоджене читання, навіть всередині однієї транзакції, встановлює і Новомосковскет свій власний знімок.
REPEATABLE READ Цей рівень ізоляції використовується в InnoDB за замовчуванням. SELECT. FOR UPDATE. SELECT. LOCK IN SHARE MODE. UPDATE. і DELETE. які використовують унікальні індекси і унікальне умова пошуку блокують тільки знайдену індексний запис і не блокують інтервал перед нею. В інших випадках ця операція використовує блокування наступного ключа, блокує діапазон індексів, просканованих блокуванням наступного ключа або інтервального, і блокує нові додавання іншими користувачами.
В узгодженому читанні є важлива відмінність від попереднього рівня ізоляції: на цьому рівні все узгоджені читання всередині тієї ж самої транзакції Новомосковскют знімок, зроблений для першого читання. Ця угода означає, що якщо ви виконаєте кілька простих вибірок (SELECT) всередині тієї ж самої транзакції, ці вибірки будуть цілісними по відношенню один до одного.
SERIALIZABLE Цей рівень схожий на попередній, але прості SELECT перетворюються в SELECT. LOCK IN SHARE MODE.