1. 程式人生 > >MySQL--當事務遇到DDL命令

MySQL--當事務遇到DDL命令

ans 一次 語句 數據 進行 nsa ima lec 回話

眾所周知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
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命令