Наша програма запускає INSERT-запит до бази даних MySQL для додавання записів. Хочеться знати, чи автоматично записуються записи. Якщо я запускаю команду ROLLBACK, коли база даних виконує відкат? Чи можливий ROLLBACK після COMMIT?
Наша програма запускає INSERT-запит до бази даних MySQL для додавання записів. Хочеться знати, чи автоматично записуються записи. Якщо я запускаю команду ROLLBACK, коли база даних виконує відкат? Чи можливий ROLLBACK після COMMIT?
Відповіді:
Відповідь на ваше запитання залежить від того, чи ви знаходитесь в межах транзакції, яка буде охоплювати більше ніж одне твердження. (Ви позначили це питання 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.)
За замовчуванням InnoDB встановлено на автоматичну комісію = 1 або УВІМКНЕНО . Після вчинення їх не можна повернути назад .
Вам потрібно буде зробити одну з двох речей, щоб відключити її вперед:
ВАРІАНТ 1: Додайте це до /etc/my.cnf та перезапустіть mysql
[mysqld]
autocommit=0
ВАРІАНТ 2: Виконайте одне з них у відкритому конекції БД, перш ніж починати будь-який змістовний SQL
SET autocommit = 0;
START TRANSACTION;
Відповідно до цих двох варіантів, вам доведеться виконати посібник COMMIT або ручний ROLLBACK .
КАВАТИ
Якщо таблиця MyISAM, то пояснення простіше. Оскільки для двигуна зберігання даних MyISAM немає транзакцій, всі виконані INSERT, UPDATE та DELETE є постійними. Жодних відкотів.