2 yinyongxian yinyongxian 于 2016.09.22 10:45 提问

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个回答

zhuzige521888
zhuzige521888   2016.09.22 11:11
已采纳

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

zhanghaili123456789
zhanghaili123456789   2016.09.28 10:59

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

zhuzige521888
zhuzige521888   2016.09.22 10:57

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

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

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

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

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

zhuzige521888
zhuzige521888   2016.09.22 11:19

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

zhuzige521888
zhuzige521888 如果修改,就先建临时,删老表,再改名
大约一年之前 回复
zhuzige521888
zhuzige521888 如果新建表就先建临时后改名;
大约一年之前 回复
yinyongxian
yinyongxian   2016.09.22 11:40

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

Csdn user default icon
上传中...
上传图片
插入图片