Транзакції в mysql

UPDATE user_account SET allsum = allsum +1000 WHERE id = '1';
UPDATE user_account SET allsum = allsum - 1000 WHERE id = '2';

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

Для того що уникнути цього потрібно щоб обидва запити виконувалися як одне ціле. І якщо виникла помилка в одному запиті не виконалися б інші. Для цього і був придуманий механізм транзакцій.

Оператор відкриває транзакцію в MySQL: "START TRANSACTION;". Після правильного виконання всіх запитів транзакцію можна або завершити внісши всі зміни в базу даних - "COMMIT;", або відкотити повернувши все в початковий стан - "ROLLBACK".

Якщо конкретно розглядати випадок з базою MySQL то тут є кілька підводних каменів.
1. В MySQL існує кілька типів таблиць. Це ISAM, HEAP, MyISAM, InnoDB, BDB і т.д. Транзакційний механізм підтримують тільки InnoDB і BDB. Тому все таблиці з якими ви хочете працювати через транзакції слід переконвертувати в відповідний тип.
2. За замовчуванням MySQL працює в режимі autocommit. Це означає, що результати виконання будь-якого SQL-оператора, що змінює дані, будуть відразу зберігатися.

Режим autocommit можна відключити командою SET AUTOCOMMIT = 0. При відключеному режимі autocommit кожну транзакцію треба явно завершувати операторами COMMIT / ROLLBACK.

Таким чином для того щоб реалізувати одократную транзакцію вирішальну поставлену на початку статті проблему нам необхідно виконати наступний код:

START TRANSACTION;
UPDATE user_account SET allsum = allsum +1000 WHERE id = '1';
UPDATE user_account SET allsum = allsum - 1000 WHERE id = '2';
COMMIT;

Схожі статті