首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

mysql的异常处理以及回滚的有关问题

2012-02-21 
mysql的错误处理以及回滚的问题代码如下:SQL codeDELIMITER $$CREATE PROCEDURE sp_test(OUT errcode1 INT

mysql的错误处理以及回滚的问题
代码如下:

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


[解决办法]
如果有任何错误 @@error_count 都不是0

所以你的代码都回滚
[解决办法]
直接在HANDLER中ROLLBACK就行了。

SQL code
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> 

热点排行