Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中,处理异常并在出错时回滚事务的正确方法是什么?_Mysql - Fatal编程技术网

在mysql中,处理异常并在出错时回滚事务的正确方法是什么?

在mysql中,处理异常并在出错时回滚事务的正确方法是什么?,mysql,Mysql,背景: 我只是MYSQL的初学者。并尝试在MYSQL中执行事务操作 查询: 我试图改变mysql中的表,我只是改变列的数据类型。 要执行此操作,请使用tansaction。错误时回滚事务的好方法是什么 处理异常的SQL Server示例: USE XYDB BEGIN TRY BEGIN TRANSACTION; ALTER TABLE <table> ALTER COLUMN <column> MEDIUMTEXT; COMMIT TRANSACTI

背景:

我只是MYSQL的初学者。并尝试在MYSQL中执行事务操作

查询:

我试图改变mysql中的表,我只是改变列的数据类型。 要执行此操作,请使用tansaction。错误时回滚事务的好方法是什么

处理异常的SQL Server示例:

USE XYDB

 BEGIN TRY

 BEGIN TRANSACTION;

    ALTER TABLE <table> ALTER COLUMN <column> MEDIUMTEXT;
 COMMIT TRANSACTION;  

END TRY 

BEGIN CATCH  

IF @@TRANCOUNT > 0  

    ROLLBACK TRANSACTION;  

    SELECT   

    ERROR_NUMBER() AS ErrorNumber  

,ERROR_SEVERITY() AS ErrorSeverity  

    ,ERROR_STATE() AS ErrorState  

    ,ERROR_PROCEDURE() AS ErrorProcedure  

    ,ERROR_LINE() AS ErrorLine  

    ,ERROR_MESSAGE() AS ErrorMessage;  

    END CATCH;  
GO  
使用XYDB
开始尝试
开始交易;
ALTER TABLE ALTER COLUMN MEDIUMTEXT;
提交事务;
结束尝试
开始捕捉
如果@TRANCOUNT>0
回滚事务;
挑选
错误号()作为错误号
,ERROR_SEVERITY()作为ErrorSeverity
,ERROR_STATE()作为ErrorState
,ERROR_PROCEDURE()作为ErrorProcedure
,ERROR_LINE()作为ErrorLine
,ERROR_MESSAGE()作为ErrorMessage;
末端捕捉;
去

Alter Table是一个DDL命令,您可以在MySQL中使用它,如下所示:

ALTER TABLE <table> CHANGE COLUMN <column> Parchar(100);
ALTER TABLE CHANGE COLUMN Parchar(100);
上面的查询是自动提交的,您永远不能回滚相同的查询


如果要回滚,请使用所需的列数据类型再次运行alter table命令。

alter table是一个DDL命令,您可以在MySQL中使用该命令,如下所示:

ALTER TABLE <table> CHANGE COLUMN <column> Parchar(100);
ALTER TABLE CHANGE COLUMN Parchar(100);
上面的查询是自动提交的,您永远不能回滚相同的查询


如果要回滚,请使用所需的列数据类型再次运行alter table命令。

在MySQL中的事务中不可能使用DDL(创建/更改表)语句

这些语句有自己的“事务”(每个语句单独),它是自动提交的

如果在事务中运行
ALTER TABLE…
,则事务将在ALTER之前提交

如果只有一条语句,则无需执行任何操作,它要么失败(表将保持不变),要么成功(表将正确更改)


如果您需要执行多个
ALTER..
,则无法将它们分组到一个事务中。

在MySQL中的事务中不可能使用DDL(create/ALTER table)语句

这些语句有自己的“事务”(每个语句单独),它是自动提交的

如果在事务中运行
ALTER TABLE…
,则事务将在ALTER之前提交

如果只有一条语句,则无需执行任何操作,它要么失败(表将保持不变),要么成功(表将正确更改)


如果您需要执行多个
ALTER..
,则无法将它们分组为一个事务。

前面的评论者回答了您发布的代码有什么问题。关于异常处理过程本身:下面是回滚代码块的示例,它能够将错误记录到其他表中,而不会丢失MySQL中的异常详细信息,并在记录错误后再次抛出错误

# CREATE PROCEDURE AND OTHER DECLARE STATEMENTS HERE
# ....

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;

    ROLLBACK;

    SET @full_error = CONCAT('ERR:', @errno, '(', @sqlstate, '):', @text);

    CALL sp_logaction(@full_error); # Some logging procedure

    RESIGNAL;
END;
# PROCEDURE BODY WITH START TRANSACTION & COMMIT HERE
# .....

之前的评论者回答了您发布的代码有什么问题。关于异常处理过程本身:下面是回滚代码块的示例,它能够将错误记录到其他表中,而不会丢失MySQL中的异常详细信息,并在记录错误后再次抛出错误

# CREATE PROCEDURE AND OTHER DECLARE STATEMENTS HERE
# ....

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;

    ROLLBACK;

    SET @full_error = CONCAT('ERR:', @errno, '(', @sqlstate, '):', @text);

    CALL sp_logaction(@full_error); # Some logging procedure

    RESIGNAL;
END;
# PROCEDURE BODY WITH START TRANSACTION & COMMIT HERE
# .....

非常感谢。但是,如果我想执行任何DML操作,那么在mysql中如何处理异常并在出错时回滚事务呢?我从来没有在SQL脚本/过程中这样做过。通常,异常和错误在应用程序代码中,事务在那里处理。谢谢。但是,如果我想执行任何DML操作,那么在mysql中如何处理异常并在出错时回滚事务呢?我从来没有在SQL脚本/过程中这样做过。通常,异常和错误在应用程序代码中,事务在那里处理。