1

我們有一個在事務範圍內運行的測試。我們最後處理事務範圍以避免更改數據庫。是否有可能將事務範圍與在存儲過程中提交事務結合起來?

這在大多數情況下工作正常。

但是,當我們使用實體框架來執行一個存儲過程,其中包含一個事務,這是在存儲過程中提交的。我們得到以下錯誤:

「分佈式事務完成無論是在一個新的事務或NULL事務中登記本次會議\ r \ n」個

是犯有內部交易可以合併事務範圍存儲在程序?

回答

6

雖然你可能或可能無法解決這個問題,但我建議避免它完全可能是一個更好的選擇。正如你所看到的,根據一個事務來保證你的數據庫處於一個特定的狀態並不總是有效。另外,因爲您正在使用到數據庫的多個連接,所以您已經自動提升了分佈式事務中發生的任何事務 - 這可能是微妙的區別,但它會改變測試的性質。您最終可能會編寫代碼來克服分佈式事務的特殊限制,否則這些限制將不再需要。

更好的策略是 - 對於單元測試,無論如何 - 模擬數據庫依賴性,使用內存中的模擬對象或假對象代替數據庫。我爲LINQ to SQL做了類似的事情(請參閱我的blog entry關於此主題)對於集成測試,我認爲您最好使用測試實例並編寫設置代碼,以便在每次測試之前將DB的狀態重新初始化爲已知值比引入額外的交易來清理東西。這樣,如果您的清理代碼在測試中失敗,則不會影響正在運行的其他測試。

+0

如果可以的話,我會給這兩張票。 – 2009-09-23 13:28:18

1

我用下面的代碼的SP內部處理環境,其中一個交易可能或力可能不是當前: -

DECLARE @InTran int 

Set @InTran = @@TRANCOUNT 

IF @InTran = 0 BEGIN TRANSACTION 

/* Stuff happens */ 

IF @InTran = 0 AND @@TRANCOUNT > 0 COMMIT TRANSACTION 

只有我不知道的事情是,如果@@ TRANCOUNT反映來自交易範圍的交易,儘管它值得一試。

相關問題