我遗漏了有关使用 MySQL 事务的一些信息。我有一个脚本,它从某些表中删除数据,然后将数据插入这些表。如果出现任何错误,我希望它回滚所有内容(删除和任何已完成的插入)。我读了MySQL 文档关于这个问题,我理解使用START TRANSACTION
将禁用自动提交,但是当我故意在脚本中导致错误时,更改不会回滚(即事务没有按照我的期望进行)。
我发现这个问题(以及其他类似的程序),但它们都使用存储过程。我不想使用存储过程,我有一个 *.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;