我找不到在MySql存储过程中使用事务的最佳方法。如果出现任何问题,我想要ROLLBACK
:
BEGIN
SET autocommit=0;
START TRANSACTION;
DELETE FROM customers;
INSERT INTO customers VALUES(100);
INSERT INTO customers VALUES('wrong type');
COMMIT;
END
1)需要使用autocommit=0
吗?
2)如果第二个INSERT
出现错误(当然会出错),第一个INSERT
不会回滚。程序仅仅继续执行到COMMIT
。如何防止这种情况发生?
3)我发现可以DECLARE HANDLER
,我应该使用这个指令还是有更简单的方法来表示,如果任何命令失败,存储过程应该ROLLBACK
并且也失败?
DECLARE HANDLER
工作得很好,但由于我使用的是MySql 5.1版本,无法使用RESIGNAL
。因此,如果出现错误,调用者将不会收到通知:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
-- RESIGNAL; not in my version :(
END;
START TRANSACTION;