MySQL 當事務遇到DDL命令

2021-09-07 15:06:00 字數 1177 閱讀 3861

眾所周知mysql的ddl語句是非事務的,即不能對dll語句進行回滾操作,哪在事務中包含ddl語句會怎樣呢?

如:

#禁用自動提交

set autocommit=

off;

#建立tb1

create

table tb1(id int auto_increment primary

key,c1 int

);#開始事務

start

transaction

;#插入資料

insert

into tb1(c1) select1;

insert

into tb1(c1) select2;

insert

into tb1(c1) select3;

#建立tb2

create

table tb2(id int auto_increment primary

key,c1 int);

這時候如果執行rollback,會發現插入到tb1中資料沒有被回滾:

如果檢視binlog:

在建立tb2之前,有乙個commit操作將上面語句中的事務進行提交,因此雖然後面執行了rollback操作,但實際上rollback的是另外乙個空事務,所以沒有任何資料發生「回滾」。

在執行研發同事提交的指令碼時,應當將ddl和dml語句以及dcl語句嚴格分開,避免事務被隱性「破壞」,導致誤操作情況發生。

比如你開啟乙個事務正在修改資料,恰好研發同事找你在這個庫上新建乙個表,剪完你發現自己資料改錯了,此時再想回滾就悲劇啦!

又比如研發給你乙個事務指令碼,中間夾渣乙個ddl語句,導致事務「中途」提交一次,等最後發現異常要回滾卻發現只能回滾一部分。

總結:當執行到ddl語句時,會隱式的將當前回話的事務進行一次「commit」操作,因此在mysql中執行ddl語句時,應該嚴格地將ddl和dml完全分開,不能混合在一起執行。

MySQL常用DDL操作命令

本篇內容涉及兩個方面 資料庫操作的常用的ddl命令 表操作的常用的ddl命令 建立資料庫 create databases if notexists db name character set 註解 db name 資料庫名 if not exists 表示資料庫不存在時,才能建立資料庫。chara...

mysql事務中ddl語句的隱式提交

1 當執行到ddl語句時,會隱式的將當前回話的事務進行一次 commit 操作,因此在mysql中執行ddl語句時,應該嚴格地將ddl和dml完全分開,不能混合在一起執行。2 為什麼ddl語句會隱式提交?因為ddl是資料定義語言,在我們的資料庫中承擔著建立,刪除和修改的重要的職責。一旦發生問題,帶來...

MySQL事務鎖命令語句集合

檢視資料庫innodb狀態 show engine innodb status 檢視當前是否有事務執行 select from information schema.innodb trx 通過kill結束當前事務 kill trx mysql thread id 檢視當前執行緒處理情況,如果不使用f...