gpt4 book ai didi

NHibernate ExecuteUpdate 不参与当前事务?

转载 作者:行者123 更新时间:2023-12-04 00:27:34 25 4
gpt4 key购买 nike

我有如下代码:

using (var session = this.sessionCreator.OpenSession())
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(anObject);
session.CreateSQLQuery(sql)
.ExecuteUpdate();
transaction.Commit();
}

令人惊讶的是,SQL 查询在 anObject 之前执行被保存。显然, ExecuteUpdate命令不参与当前事务。有没有办法让更新登记在交易中?

最佳答案

NHibernate 事务与 DB 事务不同;框架无法知道您的 ExecuteUpdate 哪些实体或哪些数据正在影响,因此不会自动刷新 SaveOrUpdate 之间的 session (这可能会被推迟,取决于 session 的 FlushMode )和 CreateSQLQuery (如果您使用 ExecuteUpdate ,这总是立即的)。

一般来说,如果您将 NHibernate 逻辑与较低级别的 SQL 逻辑(存储过程等)相结合,那么您将需要使用 TransactionScope为了保证原子性:

using (var tsc = new TransactionScope())
using (var session = sessionFactory.OpenStatelessSession())
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(entity);
session.Flush();
session.CreateSQLQuery("EXEC foo").ExecuteUpdate();
transaction.Commit();
tsc.Complete();
}

(FWIW - 严格来说,NHibernate 事务在这里应该是不必要的,因为在 Flush 之后你实际上并没有对 session 做任何事情 - 但是无论如何使用显式 NH 事务是一种很好的做法,以防将来逻辑发生变化.)

请注意,我更喜欢使用 IStatelessSession任何批量插入/更新/等的实例。 - 如果您使用的是常规 ISession实例并需要实际检索 ExecuteUpdate 所做的更新,那么您可能需要使用 session 的 EvictClear保证获取更新的方法。

关于NHibernate ExecuteUpdate 不参与当前事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10593447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com