代码如下:DELIMITER $$CREATE PROCEDURE sp_test(OUT errcode1 INT,OUT errcode2 INT)
sp_test_l:
BEGIN
DECLARE CONTINUE HANDLER FOR 1452 SELECT 'Foreign key error';
START TRANSACTION;
SET errcode1=@@error_count;
INSERT INTO acct_access_log (accountno,al_type,al_time,al_address,al_session) VALUES
('RCT01',0,CURRENT_TIMESTAMP,'192.168.101.171','123456789');
INSERT INTO acct_access_log (accountno,al_type,al_time,al_address,al_session) VALUES
(123,0,CURRENT_TIMESTAMP,'192.168.101.171','123456789');
IF @@error_count<>0 THEN
SET errcode2=1;
rollback;
leave sp_test_l;
END IF;
COMMIT;
END sp_test_l$$DELIMITER ;上面的代码第二个insert是会因为外键的原因而失败的我想在第二个insert之后检测错误,如果有任何错误(包含因外键导致的不一致以及其他可能未知的问题),则回滚
sp_test_l:
BEGIN
DECLARE CONTINUE HANDLER FOR 1452 SELECT 'Foreign key error';
START TRANSACTION;
SET errcode1=@@error_count;
INSERT INTO acct_access_log (accountno,al_type,al_time,al_address,al_session) VALUES
('RCT01',0,CURRENT_TIMESTAMP,'192.168.101.171','123456789');
INSERT INTO acct_access_log (accountno,al_type,al_time,al_address,al_session) VALUES
(123,0,CURRENT_TIMESTAMP,'192.168.101.171','123456789');
IF @@error_count<>0 THEN
SET errcode2=1;
rollback;
leave sp_test_l;
END IF;
COMMIT;
END sp_test_l$$DELIMITER ;上面的代码第二个insert是会因为外键的原因而失败的我想在第二个insert之后检测错误,如果有任何错误(包含因外键导致的不一致以及其他可能未知的问题),则回滚
你是否用的innodb存储引擎? MyISAM 存储引擎不支持事务。
代码没有问题,可以执行,只是没有回滚
而且没有回滚
试了,没用
在这句之前 select @@error_count 看一下内容是什么。
你的过程中有一个 SELECT 'Foreign key error'; 这个SELECT运行后就将 @@error_count 清0了
-> id int primary key,
-> c int
-> );
Query OK, 0 rows affected (0.09 sec)mysql> DELIMITER $$
mysql> CREATE PROCEDURE sp_cqlxm()
-> BEGIN
-> DECLARE CONTINUE HANDLER FOR 1062 rollback ;
-> START TRANSACTION;
-> insert into t_cqlxm values (1,1);
-> insert into t_cqlxm values (1,1);
->
-> COMMIT;
-> END
-> $$
Query OK, 0 rows affected (0.00 sec)mysql> DELIMITER ;
mysql> call sp_cqlxm();
Query OK, 0 rows affected (0.05 sec)mysql> select * from t_cqlxm;
Empty set (0.00 sec)mysql>
set @errors = @@error_count然后判断@errors自定义变量是存储在会话范围内的
但是还有一个问题没有解决,就是我只可以捕获我已知的错误,有时候sql语句是有一些自己没有预料到的错误发生的,这个时候也要回滚,怎么办?
看看其它朋友有什么好的办法。