當前位置:首頁 » 存儲配置 » mysql存儲過程回滾

mysql存儲過程回滾

發布時間: 2022-07-05 16:28:03

① mysql 存儲過程 DDL 參數

MySQL8.0 開始支持原⼦ DDL(atomic DDL),數據字典的更新,存儲引擎操作,寫⼆進制日誌結合成了一個事務。在沒有原⼦DDL之前,DROP TABLE test1,test2;如遇到server crash,可能會有test1被drop了,test2沒有被drop掉。下面來看下在MySQL8.0之前和MySQL8.0 數據字典的區別

在MySQL8.0 之前,Data Dictionary除了存在與.FRM, .TRG, .OPT ⽂件外,還存在於系統表中(MyISAM ⾮事務引擎表中),在MySQL8.0 ,Data Dictionary 全部存在於Data Dictionary Storage Engine(即 InnoDB表中),這使crash recovery 維持原⼦性成為了可能


存儲引擎⽀持

目前,只有InnoDB存儲引擎⽀持原子DDL,為了實現原子DDL,Innodb要寫DDL logs 到 mysql.innodb_ddl_log 表,這是⼀個隱藏在mysql.ibd 數據字典表空間⾥的數據字典表。要看mysql.innodb_ddl_log 中的內容,需要

SET GLOBALLOG_ERROR_VERBOSITY=3;(MySQL 8.0 默認為2,error log 記錄Errors and

warnings,不不記錄notes)

SET GLOBAL innodb_print_ddl_logs=1;

CREATE TABLEt1 (c1 INT)ENGINE=InnoDB;

查看error log

[Note] [MY-011066] InnoDB: DDL loginsert: [DDLrecord:DELETE SPACE,id=30,

thread_id=25, space_id=9, old_file_path=./test/t1.ibd]

[Note] [MY-011066]InnoDB:DDL logdelete:by id30

[Note] [MY-011066]InnoDB:DDL loginsert: [DDLrecord: REMOVECACHE,id=31,

thread_id=25, table_id=1066, new_file_path=test/t1]

[Note] [MY-011066]InnoDB:DDL logdelete:by id31

[Note] [MY-011066]InnoDB:DDL loginsert: [DDLrecord: FREE,id=32, thread_

id=25, space_id=9, index_id=143, page_no=4]

[Note] [MY-011066]InnoDB:DDL log delete:by id32

[Note] [MY-011066]InnoDB:DDL logpost ddl :begin for thread id: 25

[Note] [MY-011066]InnoDB:DDL logpost ddl :end for thread id: 25


原子DDL 操作步驟

  • 准備:創建所需的對象並將DDL⽇志寫入 mysql.innodb_ddl_log表中。DDL日誌定義了如何前滾和回滾DDL操作。

  • 執行:執⾏DDL操作。例如,為CREATE TABLE操作執⾏創建。

  • 提交:更新數據字典並提交數據字典事務。

  • Post-DDL:重播並從mysql.innodb_ddl_log表格中刪除DDL⽇志。為確保回滾可以安全執⾏⽽不引⼊不⼀致性,在此最後階段執⾏⽂件操作(如重命名或刪除數據文件)。這一階段還從 mysql.innodb_dynamic_metadata的數據字典表刪除的動態元數據為了DROP TABLE,TRUNCATE和其它重建表的DDL操作。

  • ⽆論事務是提交還是回滾,DDL日誌都會mysql.innodb_ddl_log在Post-DDL階段重播並從表中刪除 。mysql.innodb_ddl_log如果伺服器在DDL操作期間暫停,DDL⽇志應該只保留在表中。在這種情況下,DDL⽇志會在恢復後重播並刪除。

    在恢復情況下,當伺服器重新啟動時,可能會提交或回退DDL事務。如果在重做⽇志和⼆進制日誌中存在DDL操作的提交階段期間執⾏的數據字典事務,則該操作被認為是成功的並且被前滾。否則,在InnoDB重放數據字典重做日誌時回滾不完整的數據字典事務 ,並且回滾DDL事務。

    原⼦DDL ⽀持類型

    • DROP TABLES , all tables dropped or none

    • DROP SCHEMA, all entities in the schema are dropped, or none

    • Note that atomic DDL statements will be rolled back or committed even in case of crash, e.g. RENAME TABLES

    • CREATE TABLE would be successfully committed or rolled back (no orphan ibd left)

    • TRUNCATE TABLE (including InnoDB tables with FTS AUX tables) would be successfully committed or rolled back

    • RENAME TABLES, all or none

    • ALTER TABLE successful or not done

    示例

    結論

    在MySQL8.0之前,alter table 操作在server crash的情況下,會遺留.frm,.ibd文件。MySQL8.0 能實現原⼦DDL(包括 DROP TABLE, DROP SCHEMA, CREATE TABLE, TRUNCATE TABLE, ALTER TABLE),alter table 操作,在server crash的情況下,不會遺留.frm,.ibd臨時文件。讓我們⼀起期待MySQL8.0 GA的到來吧!

② mysql 存儲過程rollback後面的語句還會執行嗎

會執行。一般
回滾
操作都是寫在
異常處理
,或是sql的最後。如果你的sql中出現錯誤,代碼會立即跳轉到錯誤處理代碼上執行,比如回滾,但緊接在錯誤行之後的代碼不會執行的。

③ MySQL存儲過程事務回滾中有游標遍歷,如何處理

請說詳細些,最好有貼代碼出來

④ mysql存儲過程中有沒有類似try catch

在存儲過程中使用事務時,如果沒有try…catch語句,那麼當set xact_abort
on時,如果有錯誤發生,在批處理語句結束後,系統會自動回滾所有的sql操作。當set xact_abort
off時,如果有錯誤發生,在批處理語句結束後,系統會執行所有沒有發生錯誤的語句,發生錯誤的語句將不會被執行。

在存儲過程中使用事務時,如果存在try…catch語句塊,那麼當捕獲到錯誤時,需要在catch語句塊中手動進行Rollback操作,否則系統會給客戶端傳遞一條錯誤信息。如果在存儲過程開始處將set
xact_abort
on,那麼當有錯誤發生時,系統會將當前事務置為不可提交狀態,即會將xact_state()置為-1,此時只可以對事務進行Rollback操作,不可進行提交(commit)操作,那麼我們在catch語句塊中就可以根據xact_state()的值來判斷是否有事務處於不可提交狀態,如果有則可以進行rollback操作了。如果在存儲過程開始處將set
xact_abort
off,那麼當有錯誤發生時,系統不會講xact_state()置為-1,那麼我們在catch塊中就不可以根據該函數值來判斷是否需要進行
rollback了,但是我們可以根據@@Trancount全局變數來判斷,如果在catch塊中判斷出@@Trancount數值大於0,代表還有未提交的事務,既然進入catch語句塊了,那麼還存在未提交的事務,該事務應該是需要rollback的,但是這種方法在某些情況下可能判斷的不準確。推薦的方法還是將set
xact_abort on,然後在catch中判斷xact_state()的值來判斷是否需要Rollback操作。

下面我們來看看兩個例子:

一.使用Set xact_abort on

代碼

Create proc myProcere

As

begin

set xact_abort on;

begin try

begin tran

insert into TestStu values('Terry','boy',23);

insert into TestStu values('Mary','girl',21);

commit tran

end try

begin catch

--在此可以使用xact_state()來判斷是否有不可提交的事務,不可提交的事務

--表示在事務內部發生錯誤了。Xact_state()有三種值:-1.事務不可提交;

--1.事務可提交;0.表示沒有事務,此時commit或者rollback會報錯。

if xact_state()=-1

rollback tran;

end catch

end

二.使用Set xact_abort off

代碼

Create proc myProcere

As

begin

set xact_abort off;

begin try

begin tran

insert into TestStu values('Terry','boy',23);

insert into TestStu values('Mary','girl',21);

commit tran

end try

begin catch

--在此不可以使用xact_state來判斷是否有不可提交的事務

--只可以使用@@Trancount來判斷是否有還未提交的事務,未提交的事務未必

--就是不可提交的事務,所以使用@@TranCount>0後就RollBack是不準確的

if @@TranCount>0

rollback tran;

end catch

end

另外,對於@@Trancount需要說明的是,begin tran 語句將 @@Trancount加 1。Rollback tran將
@@Trancount遞減到 0,但 Rollback tran savepoint_name 除外,它不影響 @@Trancount。Commit tran 或 Commit work 將 @@Trancount 遞減 1。

⑤ mysql 多條語句,怎麼判斷其中一條執行錯誤,就執行回滾

寫一個存儲過程,在存儲過程里寫一個事物,再把你要的mysql 多條語句寫在事物裡面就行了,要用的時候調用一下存儲過程.大致格式是這樣的:

drop procere if exists accessCount;
delimiter $
create procere accessCount()
BEGIN
DECLARE t_error INTEGER DEFAULT 0;/*設置錯誤增量*/
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
START TRANSACTION;/*開啟事物*/
xxxx(你的語句)
IF t_error = 1 THEN /*執行失敗回滾*/
ROLLBACK;
ELSE
COMMIT;
END IF;
end $
delimiter ;

⑥ mysql 存儲過程 異常 是否自動 回滾

一般默認情況是會回滾的,但是如果你修改了My.ini文件裡面的安全級別就不一定了。

⑦ 寫一個Mysql存儲過程

CREATE PROCEDURE `xxxx`( )
BEGIN
#設置事務
DECLARE t_error INTEGER DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
#開啟事務
START TRANSACTION;
#插入數據
INSERT INTO 表2(欄位21,欄位22,欄位23)
SELECT 欄位11,欄位12,欄位13 FROM 表1 where xxxx ;
#刪除數據
delete 表1 where xxx;
#以上兩步操作出現任何失誤都將回滾
IF t_error = 1 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
end;

⑧ mysql存儲過程執行一半出現異常會怎麼辦

如果在存儲過程調用的時候顯式的調用了事務處理,那麼,會回滾,否則執行到那裡就在哪裡生效。

⑨ mysql 存儲過程中update影響行數為0,回滾

使用FOUND_ROWS() 獲得影響的行數,再用IF判斷是否等於0就行了。

--開始事務
starttransaction;

callsetCoin(zjAmount,0,`uid`,liqType,`type`,info,_betId,serializeId,'');
updateblast_betssetlotteryNo=_kjData,zjCount=_zjCount,bonus=zjAmount,fanDianAmount=_fanDianAmountSelfwhereid=_betId;
IFFOUND_ROWS()=0THEN
ROLLBACK;
ELSE
COMMIT;
ENDIF;
commit;
熱點內容
怎麼查伺服器ip段 發布:2024-10-09 13:08:04 瀏覽:151
ftpaws 發布:2024-10-09 12:53:20 瀏覽:271
生化危機5ftp 發布:2024-10-09 12:45:22 瀏覽:226
系統的安全配置有哪些 發布:2024-10-09 12:31:41 瀏覽:569
安卓馬桶蓋怎麼拆 發布:2024-10-09 12:19:00 瀏覽:219
移動硬碟文件夾消失 發布:2024-10-09 12:18:20 瀏覽:547
編譯器會自動為它賦初值 發布:2024-10-09 11:42:28 瀏覽:349
演算法自愈 發布:2024-10-09 11:42:27 瀏覽:691
小米密碼輸入錯誤多少次會被鎖 發布:2024-10-09 11:41:46 瀏覽:578
源碼種類 發布:2024-10-09 11:20:35 瀏覽:365