【发布时间】:2012-11-04 00:30:06
【问题描述】:
private void btnConfigure_Click(object sender, EventArgs e)
{
try
{
dbConfigure dc = new dbConfigure();
SqlTransaction tr = conn.BeginTransaction();
cmd.Transaction = tr;
if (dc.configuration(cmd, ps.tableNames))
tr.Commit();
else
{
tr.Rollback();
mesg.show("Transaction is Rolled back");
}
}
catch (Exception ex)
{
mesg.show(ex.Message);
}
}
如果我在 configuration 方法的任何地方遇到问题,那么它会返回 false,我可以看到消息 Transaction is Rolled Back。但实际上事务并没有完全回滚,并且尽管回滚,但该函数对数据库结构所做的一些更改仍然存在,这是非常不希望的。我的问题是事务回滚发生故障的可能性是什么?
我的项目中除了共享(以上)方法之外没有其他任何事务
小细节
我正在调用我班级 dbConfigure 的一个非常冗长/复杂的函数 configuration。它对数据库结构进行了一些必要的更改。例如它
- 丢弃外键
- 删除主键
-
删除自动增量字段
它会在删除之前保存这些键并以所需的顺序/位置重新创建
conn 是一个已经打开的SqlConnection,除此之外我没有使用任何连接
cmd 是 conn.CreateCommand() 除此以外我不使用任何命令
在整个过程中我从不关闭连接,但是 SqlDataReader 在完成工作时会在 configuration 函数中关闭。
【问题讨论】:
-
非常感谢@Morten Jacobsen。我不这么认为。所以我得到了我的答案。但是,如果有任何方法可以做到这一点,请您也指导一下吗?意思是如果另一个创建表失败后回滚创建表?
-
是的@GeorgeStocker。尽管您告诉的链接似乎对解决我的问题没有多大帮助。但是我很高兴我通过这个问题学到了一些东西。最好的答案可能是帮助我找到一种方法来回滚数据库中的结构更改。但至少您的评论提供了一些指导和一些这样做的动力。您可以将其发布为答案,如果我找不到更好的答案,我肯定会接受它。因为它是有效的答案
-
我已经删除了我之前的评论,因为正如 Remus Rusanu 所指出的,实际上可以在 SQL Server 中执行事务 DDL。我的评论基于不可能的 Oracle 数据库。
标签: c# sql-server transactions rollback