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) 支持创建/删除表或更改表结构吗?
求指导回滚没有生效的原因?

6个回答

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

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

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

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

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

yinyongxian
yinyongxian 表a仍存在,回滚没有生效。原目的就是用事务避免写drop()之类的回滚语句。
接近 4 年之前 回复
yinyongxian
yinyongxian mySqlCommandb.ExecuteNonQuery(); 会抛异常,不会执行transaction.Commit(); 异常处理中执行了transaction.Rollback();
接近 4 年之前 回复

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

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

zhuzige521888
一个程序猿子 如果修改,就先建临时,删老表,再改名
接近 4 年之前 回复
zhuzige521888
一个程序猿子 如果新建表就先建临时后改名;
接近 4 年之前 回复

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐