在mysql中,处理异常并在出错时回滚事务的正确方法是什么?
背景: 我只是MYSQL的初学者。并尝试在MYSQL中执行事务操作 查询: 我试图改变mysql中的表,我只是改变列的数据类型。 要执行此操作,请使用tansaction。错误时回滚事务的好方法是什么 处理异常的SQL Server示例:在mysql中,处理异常并在出错时回滚事务的正确方法是什么?,mysql,Mysql,背景: 我只是MYSQL的初学者。并尝试在MYSQL中执行事务操作 查询: 我试图改变mysql中的表,我只是改变列的数据类型。 要执行此操作,请使用tansaction。错误时回滚事务的好方法是什么 处理异常的SQL Server示例: USE XYDB BEGIN TRY BEGIN TRANSACTION; ALTER TABLE <table> ALTER COLUMN <column> MEDIUMTEXT; COMMIT TRANSACTI
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脚本/过程中这样做过。通常,异常和错误在应用程序代码中,事务在那里处理。