MySQL 5.6在日志表和ROLLBACK之前的DML中获取诊断信息

时间:2014-01-07 09:48:31

标签: mysql stored-procedures

显然我不能将GET DIAGNOSTICS和ROLLBACK语句组合在一个存储过程中:除了捕获错误之外,我希望能够反转所有以前处理过的数据,而不仅仅是停止执行。请在下面找到我的剧本:

  • 创建日志表:
CREATE TABLE tbl_logs (

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,

`txt` VARCHAR(100) NOT NULL,

PRIMARY KEY (`id`));
  • 创建存储过程:
DELIMITER $$

CREATE PROCEDURE `test`() 

BEGIN 

DECLARE state CHAR(5) DEFAULT ’00000′;

DECLARE msg TEXT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION 

begin 

   rollback;

   GET DIAGNOSTICS CONDITION 1 state = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;

   insert into tbl_logs (txt) select concat(‘Error ‘,state,’: ‘,msg);

 end;

start transaction; 

   insert into tbl_logs (txt) select state;

   – drop table no_such_table;

   insert into tbl_logs (txt) select ‘commit’; 

commit; 

END
  • 致电程序:
call test(); 

select * from tbl_logs;

=>检查表:2行

00000

提交


  • 修改程序:

    取出评论,使下拉表可见。


  • 致电程序:
call test();

select * from tbl_logs;

=>检查表:2个新行而不是一个,最后一个

00000

错误42S02:未知表'no_such_table'


=>处理程序捕获错误并停止执行,只是不考虑回滚(无论以前做什么/其他DML,它们都被提交)...

我做错了什么?

1 个答案:

答案 0 :(得分:0)

正如DROP TABLE Syntax所述:

  

注意

     

DROP TABLE会自动提交当前有效的交易,除非您使用TEMPORARY关键字。