眾所周知mysql的ddl語句是非事務的,即不能對dll語句進行回滾操作,哪在事務中包含ddl語句會怎樣呢?
如:
#禁用自動提交這時候如果執行rollback,會發現插入到tb1中資料沒有被回滾: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);
如果檢視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...