gpt4 book ai didi

MySQL 5.6 GET DIAGNOSTICS 到日志表和 ROLLBACK 以前的 DML

转载 作者:行者123 更新时间:2023-12-05 07:59:39 24 4
gpt4 key购买 nike

显然我无法在存储过程中组合 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 之前制作了什么/在哪里,它们都是提交的)...

我做错了什么?

最佳答案

根据 DROP TABLE Syntax 记录:

Note 

DROP TABLE automatically commits the current active transaction, unless you use the TEMPORARY keyword.

关于MySQL 5.6 GET DIAGNOSTICS 到日志表和 ROLLBACK 以前的 DML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20968432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com