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