NHibernate Race Condition在一个事务中的两个语句上

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NHibernate Race Condition在一个事务中的两个语句上相关的知识,希望对你有一定的参考价值。

我一直试图在一个事务中执行下面的代码,但似乎执行的顺序不合适。

 var UpdateQuery = ""; // Some update query

 session.Transaction.Begin();


// Start of Statement 1
    var orders = session.Query<Order>().ToList();
                foreach (var order in orders)
                {
                    order.IsDeleted = true;
                    session.Update(order);
                }
// End of Statement 1

// Start of Statement 2

     var query = session.CreateSQLQuery(UpdateQuery)
                .SetInt32("UserId", userId);

     query.ExecuteUpdate();

// End of Statement 2

 session.Transaction.Commit();

奇怪的是,即使Query在第一个语句中。 CreateSQLQuery仍然在NHibernate Profiler中首先执行。它应该在语句1中执行Query以首先更新IsDeleted属性。我不确定我错过了什么。

答案

在使用会话时,我们实际上使用了一个抽象层。这不会一直与DB同步。这是明智的。在这里阅读更多相关信息:

http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-flushing

要解决此问题,我们需要执行sync ... FLUSH

session.Transaction.Begin();

// Start of Statement 1
...
// End of Statement 1

session.Flush(); // this will cause the SYNC of all updates 

// Start of Statement 2
...
// End of Statement 2

session.Transaction.Commit();

以上是关于NHibernate Race Condition在一个事务中的两个语句上的主要内容,如果未能解决你的问题,请参考以下文章

SEED Labs – Race Condition Vulnerability Lab

java多线程Race Condition现象及产生的原因

在C ++中写入相同值的Race Condition?

coreData executeFetchRequest 方法的 Race Condition 导致 nil 数据的问题

如何修复 Fortify Race Condition:Singleton Member Field 问题

JUC并发编程 -- 共享代来的问题(操作统一资源) & 临界区 Critical Section & 竞态条件 Race Condition