MySQL--當事務遇到DDL命令
眾所周知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) select 1; insert into tb1(c1) select 2; insert into tb1(c1) select 3; #創建tb2 createtable 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命令