MySQL предоставя различни машини за бази данни за обработка на SQL заявките. Най-популярните двигатели са MyISAM и InnoDB. От тези два механизма InnoDB поддържа транзакции, което означава, че можем да ангажираме и връщаме назад, за да извършим операция, включваща множество заявки като едно цяло. Същото не е възможно с MyISAM, тъй като не поддържа транзакции. InnoDB е по-надежден в сравнение с MyISAM, тъй като използва транзакционни регистрационни файлове за автоматично възстановяване.
Бележки :MySQL планира да премахне напълно MyISAM, тъй като InnoDB е много по-добра в производителността в сравнение с MyISAM.
Този урок предоставя подробности за обработка на транзакции в MySQL с помощта на START TRANSACTION, COMMIT и ОТМЕНАНЕ изявления. Въпреки че можем да изпълним SQL заявките поотделно, което е идеалният сценарий, в няколко случая трябва да се уверим, че всички специфични за дадена задача заявки трябва или да успеят, или да се провалят поради неуспех на някоя от заявките. Можем да разглеждаме такива задачи като единична единица, включваща множество операции или заявки за създаване, актуализиране или изтриване на редове. Следователно, в транзакционна единица, която има множество операции, тя трябва или да успее, или да се провали.
Човек трябва да внимава, докато обработва транзакции, тъй като има определени изявления, които не могат да бъдат върнати назад. Това включва база данни CREATE/DROP, таблица CREATE/ALTER/DROP или съхранени процедури.
Свойства на транзакция
По-долу са изброени четирите стандартни свойства на транзакция. Те се наричат още КИСЕЛИНИ .
Атомност - Той гарантира, че всички операции, включени в задача или звено, са завършени успешно. В случай на неуспех на някоя от операциите, транзакцията трябва да бъде прекратена и всички предишни операции трябва да бъдат върнати обратно до предишното им състояние. Това означава, че в случай на провал на транзакция, нито една от операциите, включени в нея, не трябва да успее.
Последователност – Данните трябва да са в последователно състояние в началото и в края на транзакцията, за да се гарантира, че базата данни променя състоянията, за да отразява промените при успешно извършена транзакция.
Изолация - Транзакцията трябва да бъде завършена изолирано, скривайки междинните състояния с други транзакции. Всяка транзакция трябва да работи независимо и прозрачно една за друга.
Издръжливост - Той гарантира, че промените в данните като част от транзакция се запазват дори в случай на системна повреда. Промените не трябва да се отменят дори в случай на системна повреда.
Извлечения за транзакции
ЗАПОЧНИ ТРАНЗАКЦИЯ - Можем да използваме СТАРТ НА ТРАНЗАКЦИЯ или ЗАПОЧНЕТЕ или ЗАПОЧНЕТЕ РАБОТА за стартиране на транзакцията. НАЧАЛО или ЗАПОЧНЕТЕ РАБОТА са псевдоними на START TRANSACTION.
ЗАВЪРЖАНЕ - В случай на успех, COMMIT командата трябва да бъде издадена в края на транзакцията, за да запазят промените.
ОТМЕНА - В случай на повреда, ОТМЕНАта трябва да се издаде команда за възстановяване на състоянията, сякаш преди стартиране на транзакцията.
ЗАДАВАНЕ НА АВТОМАТИЧНО ЗАДАВАНЕ - Използвайте израза SET AUTOCOMMIT за да деактивирате автоматичното извършване в началото на транзакцията и да го активирате в края на транзакцията. Използвайте само в случай, че ЗАПОЧНЕТЕ ТРАНЗАКЦИЯ или ЗАПОЧНЕТЕ или ЗАПОЧНЕТЕ РАБОТА не се използват за обработка на транзакцията.
Пример за паричен превод
Ще обясня транзакцията, използвайки примера за вътрешнобанков паричен превод, при който определена сума пари трябва да бъде преведена от една сметка в друга сметка в същата банка.
Бележки :Този пример е само с демонстрационна цел и действителният сценарий определено ще бъде различен въз основа на банковите правила. Той също така предполага, че транзакционните заявки се обработват програмно и междинните стойности се съхраняват в подходящи променливи.
Последователността на операциите за извършване на прехвърлянето е както следва:
- Получете идентификационните номера на дебитния и кредитния клиент от заявката и съхранете в променливи.
- Получете сумата, която трябва да бъде прехвърлена от заявката и запазете в променлива.
- Започнете транзакцията.
- Получете баланса на първия клиент и съхранете в променлива.
- Получете баланса на втория клиент и съхранете в променлива.
- Отмяна на транзакцията в случай, че първият клиент няма достатъчно салдо.
- Добавете дебитна транзакция, за да отразите удръжката от първата клиентска сметка.
- Отмяна в случай на неуспех.
- Добавете кредитна транзакция, за да отразите превода към втория клиентски акаунт.
- Отмяна в случай на неуспех.
- Запишете прехвърлянето.
- Отмяна в случай на неуспех.
- Актуализиране на баланса на първия клиент.
- Отмяна в случай на неуспех.
- Актуализиране на баланса на втория клиент.
- Отмяна в случай на неуспех.
- Отвържете транзакцията.
По-долу са посочени примерните заявки за изпълнение на последователността на прехвърляне.
-- Start the transaction
START TRANSACTION;
-- Get balance of first customer
SELECT balance from ACCOUNT WHERE customer_id = 123124123;
-- Get balance of second customer
SELECT balance from ACCOUNT WHERE customer_id = 223124145;
-- Rollback in case of insufficient funds
ROLLBACK;
-- Add debit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(123124123, <amount>, 0, <reference>);
-- Rollback in case of failure
ROLLBACK;
-- Add credit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(223124145, <amount>, 1, <reference>);
-- Rollback in case of failure
ROLLBACK;
-- Add transfer transaction
INSERT INTO transfer(from,to,amount) VALUES(123124123, 223124145, <amount>);
-- Rollback in case of failure
ROLLBACK;
-- Update balance of first customer
UPDATE ACCOUNT SET balance = <balance - amount> WHERE customer_id = 123124123;
-- Rollback in case of failure
ROLLBACK;
-- Update balance of second customer
UPDATE ACCOUNT SET balance = <balance + amount> WHERE customer_id = 223124145;
-- Rollback in case of failure
ROLLBACK;
-- Commit the transaction
COMMIT;
Ясно можем да видим, че трябва да върнем обратно в случай на неуспех на всеки етап, за да се върнем обратно към първоначалните състояния, преди да започнем прехвърлянето, за да отразим действителния баланс и на двамата клиенти.
Ето как можем да се справим с транзакциите в MySQL.