NHibernate:在事务中多次更新数据库

时间:2014-08-11 11:27:27

标签: c# fluent-nhibernate

以下是我目前所拥有的简化代码 我注意到,当1/2点抛出异常时,“状态”保持为0而不是1或2 我最初认为Update()可以做到这一点,但似乎我必须调用Commit()来使更改在DB中。
对我来说这可能是一个好方法吗?
(返回/异常时显示DB中1和2的状态) 非常感谢任何帮助。

using(var tx = session.BeginTransaction()) 
{
    Monitor monitor = monitorDao.Get(id);
    if (someStatus)
    {
        monitor.status = 1;    // initially monitor.status == 0 in DB
        // Point 1: some codes that might return or throw exception
    }
    else
    {
        monitor.status = 2;
        // Point 2: some codes that might return or throw exception
    }

    monitor.status = 3;
    tx.Commit();    
}

2 个答案:

答案 0 :(得分:0)

此设置由ISession上的FlushMode控制。您应该谷歌这个主题,例如此链接提供了有关FlushMode选项的更多详细信息:http://weblogs.asp.net/ricardoperes/nhibernate-pitfalls-flush-mode

  

从不:更改永远不会自动刷新,您必须致电   ISession.Flush()显式;

     

提交:更改会立即发送   当前的ITransaction已提交,无需调用Flush();

     

自动:   如果为某些实体类型请求查询,则刷新会话   有脏的本地实体实例,不需要调用Flush();这个   是默认值;

     

始终:在任何查询之前刷新会话   执行,也不需要调用Flush()。

答案 1 :(得分:0)

您似乎必须重构代码才能获得所需的行为:

Monitor monitor = monitorDao.Get(id);
if (someStatus)
{
    using(var tx = session.BeginTransaction()) 
    {
        monitor.status = 1;    // initially monitor.status == 0 in DB
        tx.Commit();
    }
    // Point 1: some codes that might return or throw exception
}
else
{
    using(var tx = session.BeginTransaction()) 
    {
        monitor.status = 2;    // initially monitor.status == 0 in DB
        tx.Commit();
    }
    // Point 2: some codes that might return or throw exception
}

 using(var tx = session.BeginTransaction()) 
 {
      monitor.status = 3;
      tx.Commit();
 }

当您遇到异常时,第一个状态更新从未发送到您的数据库。通过为它提供单独的事务,您首先通过提交来更新数据库。然后你做你可能失败的逻辑。如果你在Point 1/2做任何事情,比如保存到数据库以及状态= 3的事务中必须有什么。那么你需要重构你的代码,以便逻辑在第二个事务中。