[英]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.