一个事务中两个语句的 NHibernate Race Condition
NHibernate Race Condition on two statements in one transaction
我一直在尝试在一笔交易中执行以下代码,但似乎执行顺序不正确。
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 中的查询以更新 IsDeleted 属性。我不确定我错过了什么。
在使用会话时,我们实际上使用了一个抽象层。这并不总是与数据库同步。这是明智的做法。在这里阅读更多相关信息:
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();
我一直在尝试在一笔交易中执行以下代码,但似乎执行顺序不正确。
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 中的查询以更新 IsDeleted 属性。我不确定我错过了什么。
在使用会话时,我们实际上使用了一个抽象层。这并不总是与数据库同步。这是明智的做法。在这里阅读更多相关信息:
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();