Чи ВИСТАВКИ отримують автоматичні дії?


13

Наша програма запускає INSERT-запит до бази даних MySQL для додавання записів. Хочеться знати, чи автоматично записуються записи. Якщо я запускаю команду ROLLBACK, коли база даних виконує відкат? Чи можливий ROLLBACK після COMMIT?


Щойно для уточнення, я помітив, що це "innodb" 19 годин тому, оскільки InnoDB використовує COMMIT / ROLLBACK.
RolandoMySQLDBA

Це отримує +1 для нагадування розробникам та DBA, щоб вони звертали увагу на трансакційну поведінку, відповідні парадигми програми, що підтримують транзакції, та їх наслідки (хороші чи погані).
RolandoMySQLDBA

Я відповів на ваше запитання коментарем під моєю відповіддю.
RolandoMySQLDBA

Відповіді:


10

Відповідь на ваше запитання залежить від того, чи ви знаходитесь в межах транзакції, яка буде охоплювати більше ніж одне твердження. (Ви позначили це питання InnoDB, відповідь була б іншою з MyISAM.)

З довідкового посібника: http://dev.mysql.com/doc/refman/5.1/uk/commit.html

За замовчуванням MySQL працює з увімкненим режимом автокомісії. Це означає, що як тільки ви виконуєте оператор, який оновлює (модифікує) таблицю, MySQL зберігає оновлення на диску, щоб зробити його постійним.

Так, так, за замовчуванням, якщо ви просто використовуєте INSERT, записи, які ви вставляєте, будуть здійснені, і немає сенсу намагатися їх повернути назад. (Це фактично те саме, що загортання кожного оператора між BEGINі COMMIT.)

Однак якщо ви чітко маєте справу з транзакціями, вам доведеться скористатися COMMITдля зберігання записів, але ви також зможете використовувати їх ROLLBACK.

Ви можете відкрити транзакцію явно за допомогою START TRANSACTION(або BEGIN). Це не залежить від autocommitналаштування (увімкнено за замовчуванням):

ІЗ СТАРТОВОЮ ТРАНЗАКЦІєю автокомісія залишається відключеною, поки ви не закінчите транзакцію з COMMIT або ROLLBACK. Потім режим автокомісії повертається до попереднього стану.

Крім того, якщо autocommit=0я думаю, що будь-який вислів після іншого завершення транзакції розпочне транзакцію (але ви все одно можете використовувати START TRANSACTIONявно); це принаймні так, як я трактую це :

Режим автокомісії. Якщо встановлено значення 1, всі зміни таблиці набирають чинності негайно. Якщо встановлено значення 0, ви повинні використовувати COMMIT, щоб прийняти транзакцію, або ROLLBACK, щоб скасувати її. Якщо автокомісія дорівнює 0, а ви змінюєте її на 1, MySQL виконує автоматичний ЗВІТ будь-якої відкритої транзакції. Інший спосіб розпочати транзакцію - використовувати оператор START TRANSACTION або BEGIN. Див. Розділ 12.3.1, «СТАРТОВА ТРАНЗАКЦІЯ, ЗВ'ЯЗКУ та синтаксис ROLLBACK».

Більш конкретно, "інший спосіб розпочати транзакцію", мабуть, означає, що встановлення "autocommit = 0" є достатньою для початку транзакції (принаймні, безпосередньо перед кожним висловлюванням на початку сеансу або після цього COMMIT/ ROLLBACK). Я б запропонував використовувати BEGINабо START TRANSACTIONявно все одно, навіть якщо autocommit=0це може зробити зрозумілішим зрозуміти, коли транзакція починається чи закінчується.

(Спосіб запуску транзакції може залежати від способу використання вашої програми MySQL.)


1
Заслуговує +1 для повного визначення протоколів транзакцій.
RolandoMySQLDBA

@Bruno, Для MyISAM, де "фіксація" та "відкат" не працюють, чи не будуть вставки напіввиконаними?
Pacerier

7

За замовчуванням InnoDB встановлено на автоматичну комісію = 1 або УВІМКНЕНО . Після вчинення їх не можна повернути назад .

Вам потрібно буде зробити одну з двох речей, щоб відключити її вперед:

ВАРІАНТ 1: Додайте це до /etc/my.cnf та перезапустіть mysql

[mysqld]
autocommit=0

ВАРІАНТ 2: Виконайте одне з них у відкритому конекції БД, перш ніж починати будь-який змістовний SQL

SET autocommit = 0;
START TRANSACTION;

Відповідно до цих двох варіантів, вам доведеться виконати посібник COMMIT або ручний ROLLBACK .

КАВАТИ

Якщо таблиця MyISAM, то пояснення простіше. Оскільки для двигуна зберігання даних MyISAM немає транзакцій, всі виконані INSERT, UPDATE та DELETE є постійними. Жодних відкотів.


Для додаткового роз'яснення моя відповідь стосується як систем зберігання даних InnoDB, так і MyISAM.
RolandoMySQLDBA

1
Про всяк випадок, якщо функцію автоматичного комітету в InnoDB вимкнено, і моя програма запускає Insert Query, і я забуваю виконати команду, як швидко втрачаються зміни?
RPK

Якщо ваша програма вручну запускає COMMIT після кожної ВСТАВКИ, вона записується і не може бути видалена. Якщо З'єднання БД відмирає перед вами COMMIT, всі зміни втрачаються і відбувається відкат. Якщо ви виконуєте будь-який DDL (CREATE TABLE, DROP TABLE, ALTER TABLE тощо) або вручну видаєте блокування таблиці, INSERT автоматично вмикаються. Якщо ви використовуєте НАЧАЛЬНУ ТРАНЗАКЦІЮ, всі невмінні зміни здійснюються.
RolandoMySQLDBA

1
Що стосується "Якщо ви використовуєте НАЧАЛЬНУ ТРАНЗАКЦІЮ, всі невмінні зміни здійснюються." (в контексті DDL, інакше це буде відмовлено), перед цим також існує неявна фіксація (неявна фіксація після - з версії 5.5.3 відповідно до документації).
Бруно

1
"Якщо ви використовуєте НАЧАЛЬНУ ТРАНЗАКЦІЮ, всі невмінні зміни здійснюються." - Я отримав цю ідею з посібника з вивчення сертифікації MySQL 5.0 (ISBN 0-672-32812-7) Сторінка 418, в якому названі НАЧАЛЬНА ПЕРЕДАЧА, Встановити AUTOCOMMIT = 1, БЛОКУВАННЯ ТАБЛИЦІ, БЕЗКОШТОВНИХ ТАБЛИЦІВ, ТАБЛЮЖЕННЯ ТАБЛИЦІ, ОЗНАЧЕННЯ ТАБЛИЦІ, СПОСІБ ТАБЛИЦІ , DROP DATABASE, CREATE INDEX, BEGIN і ALTER TABLE під заголовками "За певних обставин поточна транзакція може закінчитися неявно: Якщо ви видаєте будь-який із наведених нижче тверджень, InnoDB неявно здійснює попередні неперевірені заяви поточної транзакції і починає нова угода ".
RolandoMySQLDBA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.