我在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) 您好我正在使用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()与SqlCommand该FooClass(fc)_cannot_be_rolled_back_,这是一个坏人坏事.目前,为了这个工作我使用一个vanila sql插入 …