mysql 创建/删除表或更改表结构 “事务”回滚 不生效。

var transaction = mySqlConnection.BeginTransaction();
try
{
    string sqla = @"建表a";
    var mySqlCommanda = new MySqlCommand(sqla, mySqlConnection, transaction);
    mySqlCommanda.ExecuteNonQuery();

    string sqlb = @"建表b (写错误语句使创建失败)";
    var mySqlCommandb = new MySqlCommand(sqlb, mySqlConnection, transaction);
    mySqlCommandb.ExecuteNonQuery();

    transaction.Commit();
}
catch (Exception)
{
    transaction.Rollback();
    throw;
}

执行后创建的表a存在,回滚没有生效。
mysql事务(Transaction) 支持创建/删除表或更改表结构吗?
求指导回滚没有生效的原因?

a建表就默认提交了,不受事物控制,只能删掉,没有办法。

1、commit提交了事务就不能再rollback回滚了

2、DDL直接触发隐式提交,任何事务回滚的前提是没有commit,隐式提交直接给你commit了,后续的rollback一点意义都没有。

3、出现异常自己drop()吧。

mySqlCommandb.ExecuteNonQuery();会抛异常。
不会执行transaction.Commit();
异常处理中执行了transaction.Rollback();
实际上生成表a,回滚没有生效。
原目的就是用事务避免写drop()之类的回滚语句。

没法回滚, 可以创建个临时表来解决你的问题,创建成功后rename下临时表。

实测是mysql 创建/删除表或更改表结构的语句立即生效。
没有执行到transaction.Commit(); 就生成了表。
有没有官方说明mysql 创建/删除表或更改表结构不受事务控制?
像你说增加建表逻辑的方式解决,可以解决问题,最好流程越简化越合适。

mysql 创建/删除表或更改表结构立即生效,不会回滚