我想在一个存储过程中用回滚,如果执行过程中遇到问题,就回滚,比如
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);
这个好像不适用于在存储过程中设置回滚?请问具体怎么实现我想要的回滚呢?谢谢
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);
这个好像不适用于在存储过程中设置回滚?请问具体怎么实现我想要的回滚呢?谢谢
解决方案 »
- mysql存储过程执行一半的奇怪问题
- update 为什么不修改数据了?急啊大家看看
- mysql 跨库外键问题
- 请高手帮看下3306端口的问题
- mysql奇怪问题!
- 初级mysql 索引问题
- 使用sqlyog导入excel总是报错ERROR: File not found...是什么原因呢?
- 在eclipse里java连不上MySQL数据库
- sql:随机百分比取记录,求指教~
- Mysql自定义函数执行时间与不封装时执行时间差别很大,求解
- MySQL 5.0不支持中文全文索引吗?我在5.0.77里面是测试,可以搜到结果,不知道很多人所指的mysql不支持中文全文索引是指哪回事?
- SQL如何在多张表中将同一列数据整合查询并剔重?
DECLARE CONTINUE HANDLER FOR 1062 rollback ;
或者
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
请问那个1062那句是什么意思?是不是1062仅仅代表主键错误?
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;
declare exit HANDLER FOR SQLSTATE '23000'
declare exit HANDLER FOR SQLSTATE '21S01'
这些编号是可以随意写还是不能随意些?在什么地方查找到?
目录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参考手册的 “错误代码和消息”