2011-06-03 56 views
0

使用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();方法後,表示有,但SP的呼叫呼叫command.ExecuteNonQuery();方法之後立即顯示。因此,在SQL事件探查器中插入/更新語句之前會顯示SP調用。它讓我認爲SP在任何邏輯錯誤的插入/更新語句之前實際執行。

問題是爲什麼SP調用在調用command.ExecuteNonQuery();方法後顯示在SQL Profiler中,而不是transaction.Commit();之一?這是否意味着它在執行插入/更新語句後立即執行而不是執行?

+0

什麼是會話和事務是什麼類型? – 2011-06-03 10:26:19

+0

NHibernate.ISession和通常的顯式SQL事務 – 2011-06-03 11:08:12

回答

2

NHibernate會話像工作單元一樣工作。所有更改都存儲在會話中,並且只有在您提交事務時纔將它們保存在一起,以便在您提交它們之前不能使用您的過程,因爲它們尚未存儲在數據庫中。

在提交事務後,您必須在內存中執行計算(如果可能)或運行存儲過程。

+0

謝謝。這是答案。我找到了另一個選項:在調用SP之前調用session.Flush()。 – 2011-06-03 11:57:28

1

SQL事件探查器在執行時顯示語句。運行ExecuteReaderExecuteNonReader的語句是同步的,因此插入/更新語句將顯示在SQL事件探查器中的過程之前。

所以尋找一個解釋,你如何做插入/更新陳述?在開始向服務器發送SQL之前,您有沒有等待到commit的數據庫層?

+0

我使用NHibernate:session.Save(entity),session.Update(entity)。在開始發送SQL之前沒有等待提交的數據庫層 – 2011-06-03 11:11:26