相关疑难解决方法(0)

如果发生错误,using语句是否会回滚数据库事务?

我在using语句中有一个IDbTransaction,但我不确定如果在using语句中抛出异常,它是否会被回滚.我知道using语句会强制调用Dispose()......但是有人知道Rollback()是否也是如此?

更新:此外,我是否需要显式调用Commit(),如下所示,还是由using语句处理吗?

我的代码看起来像这样:

using Microsoft.Practices.EnterpriseLibrary.Data;

...

using(IDbConnection connection = DatabaseInstance.CreateConnection())
{
    connection.Open();

    using(IDbTransaction transaction = connection.BeginTransaction())
    {
       //Attempt to do stuff in the database
       //potentially throw an exception
       transaction.Commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# transactions using-statement rollback

81
推荐指数
3
解决办法
3万
查看次数

强制执行查询而不刷新/提交

您好我正在使用asp.net Web应用程序的每个请求事务(视图会话)模式.我在应用程序中有几个要点,我想保存一个NHibernate管理实体,然后使用常见的SQL执行几个插入和更新.这些插入/更新取决于NH保存实体将采用的ID.

问题是生成的id在事务范围内不存在.如果我强制刷新/提交id是持久的,但如果插入/更新失败,我必须回滚,但刷新/提交的实体不会.目前我正在为这些案例进行手动插入,但这是我想要改变的.那么,有没有办法在Save()之后执行SQL语句(在已打开的事务中)但不强制刷新/提交?

编辑:我正在添加一个半伪代码示例,我有4个错误的答案所以我认为人们不理解(NHibernate如何工作)在开始请求我发出一个

nhsession.BeginTransaction()
Run Code Online (Sandbox Code Playgroud)

然后在某些时候我做

FooClass fc = new FooClass("value");
nhsession.Save(fc);
ITransaction trans = nhsession.Transaction;
SqlCommand sc = new SqlCommand("some insert/update query that depends on fc's id", (SqlConnection)nhsession.Connection);
sc.Parameters.Add("id", fc.Id); //NHibernate generates the id, note i'm using assigned/hi-lo so no round trip to the db takes place
transaction.Enlist(sc);
try {
    sc.ExecuteNonQuery();
}
catch (SqlException ex){
    transaction.RollBack();
    nhsession.Close();
}
Run Code Online (Sandbox Code Playgroud)

在请求结束时我发出一个CommitTransaction()nhsession.Close()

现在这绝对不会做任何事情:FooClass (fc)尚未刷新/提交到数据库.在Save()该NH所做的操作是高达内存这一点.这意味着nhibernate没有发出sql命令,这意味着SqlCommand (sc)我之后触发的那个命令将失败,因为id不存在.

如果我做了冲洗/间提交Save()SqlCommandFooClass(fc)_cannot_be_rolled_back_,这是一个坏人坏事.目前,为了这个工作我使用一个vanila sql插入 …

c# asp.net nhibernate transactions

6
推荐指数
1
解决办法
3621
查看次数