使用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调用?这是否意味着它是在执行插入/更新语句后立即执行的?
答案 0 :(得分:2)
NHibernate会话就像工作单元一样。所有更改都存储在会话中,并且只有在您提交事务时它们才会保持在一起,因此在提交之前无法使用您的过程,因为它们尚未存储在数据库中。
您必须在内存中进行计算(如果可能),或者在提交事务后运行存储过程。
答案 1 :(得分:1)
SQL Profiler在执行时显示语句。使用ExecuteReader
和ExecuteNonReader
运行的语句是同步的,因此插入/更新语句将在SQL事件探查器中的过程之前显示。
所以寻找解释,你是如何进行插入/更新语句的?在开始向服务器发送SQL之前,是否有可能有一个等待commit
的数据库层?