代码如下: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之后检测错误,如果有任何错误(包含因外键导致的不一致以及其他可能未知的问题),则回滚

解决方案 »

  1.   

    你自己的代码有什么问题啊?什么出错提示?
    你是否用的innodb存储引擎? MyISAM 存储引擎不支持事务。
      

  2.   

    是innodb引擎,现在的问题是,第二个insert因为外键不符的原因,会失败,但是我要怎么检测到这个错误,然后回滚整个事务?
    代码没有问题,可以执行,只是没有回滚
      

  3.   

    如果有任何错误 @@error_count 都不是0所以你的代码都回滚
      

  4.   

    问题是我第一个insert会正确执行,第二个insert会出错,执行之后,返回值第一个为0,第二个为null
    而且没有回滚
    试了,没用
      

  5.   

        IF @@error_count<>0 THEN
    在这句之前 select @@error_count 看一下内容是什么。
      

  6.   


    你的过程中有一个 SELECT 'Foreign key error'; 这个SELECT运行后就将 @@error_count 清0了
      

  7.   

    直接在HANDLER中ROLLBACK就行了。mysql> create table t_cqlxm (
        ->  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>
      

  8.   

    在自己定义变量
    set @errors = @@error_count然后判断@errors自定义变量是存储在会话范围内的
      

  9.   

    恩,这样确实可以。感谢
    但是还有一个问题没有解决,就是我只可以捕获我已知的错误,有时候sql语句是有一些自己没有预料到的错误发生的,这个时候也要回滚,怎么办?
      

  10.   

    但是还有一个问题没有解决,就是我只可以捕获我已知的错误,有时候sql语句是有一些自己没有预料到的错误发生的,这个时候也要回滚,怎么办?DECLARE for Handlers 不支持通配符 % 
    看看其它朋友有什么好的办法。
      

  11.   

    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION