MySQL事務包含DDL語句會怎樣?

來源:互聯網
上載者:User

MySQL事務包含DDL語句會怎樣?

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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.