我需要在单个原子事务中执行多次插入。例如:
开始交易;
插入 ...
插入 ...
commit;
然而,当 MySQL 遇到错误时,它只会中止导致错误的特定语句。例如,如果第二个插入语句中有错误,提交仍然会发生,并且第一个插入语句将被记录。因此,当发生错误时,MySQL 事务并不是真正的事务。为了解决这个问题,我使用了一个错误退出处理程序来回滚事务。现在交易已悄然中止,但我不知道问题出在哪里。
所以这就是你的难题:
如何让 MySQL 在遇到错误时中止事务并将错误代码传递给调用者?
我怎样才能既MySQL
当事务遇到错误时中止事务,并将错误代码传递给调用者?
MySQL
确实将错误代码传递给调用者,并且根据此错误代码,调用者可以自由决定是否要提交到目前为止完成的工作(忽略此特定的错误)INSERT
语句)或回滚事务。
这与PostgreSQL
它总是在出错时中止事务,这种行为是许多问题的根源。
Update:
使用无条件是一种不好的做法ROLLBACK
存储过程内部。
存储过程是可堆叠的,而事务则不是,所以ROLLBACK
在嵌套存储过程中将回滚到事务的最开始,而不是回滚到存储过程执行的状态。
如果要使用事务来恢复出现错误的数据库状态,请使用SAVEPOINT
构造和DECLARE HANDLER
回滚到保存点:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
任一插入失败都会回滚该过程所做的所有更改并退出它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)