文章出處

眾所周知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完全分開,不能混合在一起執行。

=============================================================================

=============================================================================


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()