以下是我目前所拥有的简化代码
我注意到,当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();
}
答案 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的事务中必须有什么。那么你需要重构你的代码,以便逻辑在第二个事务中。