簡體   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