C# NHibernate:在事务中多次更新数据库
下面是我目前拥有的一个简化代码。 我注意到,当点1/2抛出异常时,状态保持为0,而不是1或2。 我最初认为更新可以做到这一点,但似乎我必须调用Commit才能在数据库中进行更改。 对我来说,有什么好方法可以做到这一点? 返回/异常时以DB显示1和2的状态。 非常感谢您的帮助C# NHibernate:在事务中多次更新数据库,c#,fluent-nhibernate,C#,Fluent Nhibernate,下面是我目前拥有的一个简化代码。 我注意到,当点1/2抛出异常时,状态保持为0,而不是1或2。 我最初认为更新可以做到这一点,但似乎我必须调用Commit才能在数据库中进行更改。 对我来说,有什么好方法可以做到这一点? 返回/异常时以DB显示1和2的状态。 非常感谢您的帮助 using(var tx = session.BeginTransaction()) { Monitor monitor = monitorDao.Get(id); if (someStatus)
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();
}
此设置由ISession上的FlushMode控制。您应该搜索此主题,例如,此链接提供了有关FlushMode选项的更多详细信息: 从不:更改从不自动刷新,您必须调用 ISession.Flush显式 提交:更改将在 当前ITransaction已提交,无需调用Flush 汽车:汽车 如果请求查询某些实体类型和类型,则刷新会话 存在脏的本地实体实例,无需调用Flush;这 是默认值 始终:在执行任何查询之前刷新会话 已执行,也无需调用Flush
似乎您必须重构代码以获得所需的行为:
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();
}
出现异常时,第一次状态更新从未发送到数据库。通过给它一个单独的事务,您首先通过提交来更新数据库。然后你做你可能失败的逻辑。如果您在第1/2点执行任何操作,如保存到db,以及状态为3的事务中必须包含的内容。然后,您需要重构代码,使逻辑位于第二个事务中 nhibernate维护加载对象的缓存。所有更新都在缓存上完成。当会话被快速刷新、事务被提交或会话被释放时,更改被提交。因此,我确实需要每个状态更新的单独事务。。谢谢:谢谢你提供关于FlushMode的信息!我不认为我会将其更改为“始终”,但很高兴知道这样的选项存在。