標籤:key 查看 命令 遇到 避免 9.png 同事 mit 禁用
眾所周知MySQL的DDL語句是非事務的,即不能對DLL語句進行復原操作,哪在事務中包含DDL語句會怎樣呢?
如:
#禁用自動認可set autocommit=off;#建立tb1create 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;#建立tb2create 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命令