繁体   English   中英

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

[英]What is correct way to handle exception and rollback a transaction in mysql on error?

背景 :

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

查询:

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

SQL Sever处理异常的示例:

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  

Alter Table是DDL命令,您可以在MySQL中使用以下命令:

ALTER TABLE <table> CHANGE COLUMN <column> Parchar(100);

上面的查询是auto commit,您永远无法回滚。

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

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

这些语句具有自己的“事务”(每个语句分别),该事务将自动提交。

如果在事务中运行ALTER TABLE ... ,则该事务将在更改之前提交。

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

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

先前的评论者回答了您发布的代码有什么问题。 关于异常处理过程本身:这是回滚代码块的示例,能够将错误记录到其他表中,而不会丢失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
# .....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM