【问题标题】:Execution of a SP out of turn in a transaction在事务中不按顺序执行 SP
【发布时间】:2011-06-03 10:21:23
【问题描述】:

使用 SQL Server 2005。

每次接收到新数据时,它都会被存储起来,然后调用一个 SP,它使用这些数据来计算一些统计数据。存储数据和调用 SP 在单个事务中执行。 SP 在事务中登记,如

using (var transaction = session.BeginTransaction())
{
    // ... executing insert/update statements ...

    var command = new SqlCommand("StoredProcedureName", connection);

    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add(new SqlParameter("@name", value));

    transaction.Enlist(command);
    command.ExecuteNonQuery();

    transaction.Commit();
}

运行 SQL Profiler 时,我可以看到所有插入/更新语句仅在调用 transaction.Commit(); 方法后显示在那里,但 SP 调用在调用 command.ExecuteNonQuery(); 方法后立即显示。因此,SP 调用显示在 SQL Profiler 中的插入/更新语句之前。这让我觉得 SP 实际上是在任何逻辑错误的插入/更新语句之前执行的。

问题是为什么在调用command.ExecuteNonQuery(); 方法而不是transaction.Commit(); 之后,SP 调用会显示在SQL Profiler 中?是不是意味着它是立即执行而不是在执行插入/更新语句之后?

【问题讨论】:

  • 会话是什么,事务是什么类型?
  • NHibernate.ISession 和通常的显式 SQL 事务

标签: sql-server stored-procedures ado.net transactions


【解决方案1】:

NHibernate 会话的工作方式类似于工作单元。所有更改都存储在会话中,并且仅在您提交事务时才会一起保存,因此您无法在提交之前使用您的过程,因为它们尚未存储在数据库中。

您必须在内存中进行计算(如果可能)或在提交事务后运行存储过程。

【讨论】:

  • 谢谢。这就是答案。我找到了另一种选择:在调用 SP 之前调用 session.Flush()。
【解决方案2】:

SQL Profiler 在执行语句时显示它们。使用ExecuteReaderExecuteNonReader 运行的语句是同步的,因此插入/更新语句将显示在 SQL Profiler 中的过程之前。

所以寻找解释,你是如何执行插入/更新语句的?您是否有可能有一个数据库层等到commit 才开始向服务器发送 SQL?

【讨论】:

  • 我使用 NHibernate: session.Save(entity), session.Update(entity)。没有数据库层等到提交才开始发送 SQL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2019-12-06
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
相关资源
最近更新 更多