Я что-то упускаю из-за использования транзакций с MySQL. У меня есть скрипт, который удаляет данные из некоторых таблиц, а затем вставляет данные в эти таблицы. Я хочу, чтобы он откатил все (удаляет и все выполненные вставки), если есть какие-либо ошибки. Я прочитал документы MySQL по этой теме и понял, что использование START TRANSACTION
отключит автоматическую фиксацию, но когда я намеренно вызываю ошибку в моем скрипте, изменения не отменяются (то есть транзакция не выполняет то, что я ожидаю).
Я нашел этот вопрос (и другим нравится), но все они используют хранимые процедуры. Я не хочу использовать sprocs, у меня есть файл * .sql, который я выполняю в SQLyog (инструмент управления MySQL), просто набор утверждений.
Вот урезанная версия скрипта, над которым я работаю:
-- Start the transaction
START TRANSACTION;
-- Delete all the table data
-- All other qb_* tables are deleted by CASCADING DELETEs
DELETE FROM `manfstudio_dev`.`qb_items`;
DELETE FROM `manfstudio_dev`.`qb_inventory_sites`;
-- Insert Inventory Site records
INSERT INTO `manfstudio_dev`.`qb_inventory_sites` (`site_id`, `name`) VALUES ('80000002-1477203394', 'CA-Orange');
INSERT INTO `manfstudio_dev`.`qb_inventory_sites` (`site_id`, `name`) VALUES ('80000001-1476941342', 'Drop Ship');
-- Insert Item records
INSERT INTO `manfstudio_dev`.`qb_items` (`item_id`, `name`, `item_number_type`, `type`) VALUES ('8000000A-1484095135', '- Internal Labor -', 'NONE', 'Service');
-- The following insert will throw an exception
INSERT INTO `manfstudio_dev`.`qb_items` (`item_id`, `name`, `item_numffffber_type`, `type`) VALUES ('80000024-1484102389', 'General Device Assembly Labor', 'NONE', 'Service');
INSERT INTO `manfstudio_dev`.`qb_items` (`item_id`, `name`, `item_number_type`, `type`) VALUES ('80000009-1483733754', 'Miscellaneous', 'NONE', 'Service');
-- Commit the transaction
COMMIT;