我想在一个存储过程中用回滚,如果执行过程中遇到问题,就回滚,比如
create procedure deleteDate()
begin
  开始监视...
  delete from table1 where tID1= 100;
  delete from table2 where tID2=90;
  如果执行这两件出错则条到最开始的状态...
end;如何做这个回滚?
我在网上找了个在php里面回滚的,它用了个判断,如下:
$handler = mysql_connect('localhost', '', '');   
mysql_select_db('test');   
mysql_query('SET AUTOCOMMIT=0'); // 设置为不自动提交查询   
mysql_query('START TRANSACTION'); // 开始查询,这里也可以使用BEGIN   
mysql_query("INSERT INTO users VALUES ('ccc')");   
mysql_query("DELETE FROM users WHERE username = 'aac'");   
if (mysql_affected_rows($handler) == 0)   
mysql_query('ROLLBACK'); // 如果删除未找到相应的记录则回滚,不执行上面的插入查询   
mysql_query('COMMIT');   
mysql_close($handler);
这个好像不适用于在存储过程中设置回滚?请问具体怎么实现我想要的回滚呢?谢谢

解决方案 »

  1.   

    我看见有的朋友这样
    DECLARE CONTINUE HANDLER FOR 1062 rollback ;
    或者
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    请问那个1062那句是什么意思?是不是1062仅仅代表主键错误?
      

  2.   

    Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY) Message: Duplicate entry '%s' for key %d 
      

  3.   

    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  4.   

    http://blog.chinaunix.net/u3/116107/showart.php?id=2349490MYSQL存储过程如何错误处理,内含事务回滚。
      

  5.   

    create procedure P1()
    begin
        declare exit HANDLER FOR SQLSTATE '23000' insert into Error(Error_ID,Error_SQLSTATE,Error_Describe,Error_time) values(1062,'23000','键%d的重复条目',now());
        declare exit HANDLER FOR SQLSTATE '21S01' insert into Error(Error_ID,Error_SQLSTATE,Error_Describe,Error_time) values(1136,'21S01','列计数不匹配行%ld上的值计数',now());
        
        rollback;            # 如果发生错误,则事务回滚
        start transaction;   #  事务开始
        insert into ta values(6,'张三',now());
        insert into ta values(7,'李四',now());
        commit;              # 事务提交
    end;
      

  6.   

    请问你的
    declare exit HANDLER FOR SQLSTATE '23000'
    declare exit HANDLER FOR SQLSTATE '21S01'
    这些编号是可以随意写还是不能随意些?在什么地方查找到?
      

  7.   

    附录B:错误代码和消息
    目录B.1. 服务器错误代码和消息
    B.2. 客户端错误代码和消息
    本章列出了当你用任何主机语言调用MySQL时可能出现的错误。首先列出了服务器错误消息。其次列出了客户端程序消息。B.1. 服务器错误代码和消息
    服务器错误信息来自下述源文件:·         错误消息信息列在share/errmsg.txt文件中。“%d”和“%s”分别代表编号和字符串,显示时,它们将被消息值取代。·         错误值列在share/errmsg.txt文件中,用于生成include/mysqld_error.h和include/mysqld_ername.h MySQL源文件中的定义。·         SQLSTATE值列在share/errmsg.txt文件中,用于生成include/sql_state.h MySQL源文件中的定义。 由于更新很频繁,这些文件中可能包含这里未列出的额外错误消息。·         错误:1000 SQLSTATE: HY000 (ER_HASHCHK) 消息:hashchk ·         错误:1001 SQLSTATE: HY000 (ER_NISAMCHK) 消息:isamchk ·         错误:1002 SQLSTATE: HY000 (ER_NO) 
    你看MYSQL参考手册的  “错误代码和消息”