NHibernate - ITransaction.Commit真的有必要吗?

时间:2010-06-12 20:30:36

标签: nhibernate

我刚刚开始研究NHibernate 2天前,我正在寻找一种基于教程编写的CRUD方法。 我的插入方法是:

        using (ISession session = Contexto.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            session.Save(noticia);
            transaction.Commit();
            session.Close();
        }

“Contexto”的完整代码位于:http://codepaste.net/mrnoo5

我的问题是:我真的需要使用 ITransaction transaction = session.BeginTransaction() transaction.Commit();

我问这个是因为我已经测试了运行没有这两行的网络应用程序,并且我已成功插入新记录。

如果可能,有人可以解释一下Itransaction的目的和方法提交吗?

由于

3 个答案:

答案 0 :(得分:9)

这是适当的通用NHibernate使用模式:

using (ISession session = sessionFactory.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
    //Do the work here
    transaction.Commit();
}

所有这些都是确保一切按预期工作所必需的(除非您使用其他基础设施)

关闭会话或对事务做任何事情除了提交都是多余的,因为会话的Dispose方法和事务负责清理,包括如果有错误则回滚。

重要的是要注意,在异常导致意外行为后,在会话中执行任何,这是限制块内显式异常处理的另一个原因。

答案 1 :(得分:3)

ITransaction transaction = session.BeginTransaction()是没有必要的,因为你通过测试发现了。

但是想象一下,当你的会话引发异常时会发生什么?你如何收回对数据库的更改?

以下是Nhib的引用...

典型的交易应使用以下习语:

ISession sess = factory.OpenSession();
ITransaction tx; 
try 
{ 
    tx = sess.BeginTransaction(); //do some work ... 
    tx.Commit(); 
} 
catch (Exception e) 
{ 
    if (tx != null) 
    tx.Rollback(); 
    throw;
} 
finally 
{ 
    sess.Close(); 
}

如果ISession抛出异常,则必须回滚该事务 并且会话被丢弃。 ISession的内部状态可能不是 异常发生后与数据库一致。 NHibernate.ISessionFactory

答案 2 :(得分:1)

您在事务上调用Commit(),它会保存对数据库的所有更改。

  

我真的需要使用ITransaction transaction = session.BeginTransaction()和transaction.Commit();?

是的,即使是简单的阅读,也可以将事务用于所有事情。

  

测试运行没有这两行的Web应用程序,我已成功插入新记录。

因为当会话被置于using语句的末尾时,会话将提交更改。

无论如何,这就是我保存的方式:

using (ISession session = Contexto.OpenSession())
{
    using (ITransaction transaction = session.BeginTransaction())
    {
        try
        {
            session.Save(noticia);
            transaction.Commit();
        }
        catch(HibernateException)
        {
            transaction.Rollback();
            throw;
        }
    }
}