在交易中反过来执行SP

时间:2011-06-03 10:21:24

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

使用SQL Server 2005。

每次接收到新数据时,都会存储该数据并在此之后调用SP,该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事件探查器时,我发现只有在调用transaction.Commit();方法后才显示所有插入/更新语句,但在调用command.ExecuteNonQuery();方法后立即显示SP调用。因此,SP调用将在SQL事件探查器中的插入/更新语句之前显示。这让我觉得SP实际上是在逻辑错误的任何插入/更新语句之前执行的。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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