2012-08-23 28 views
2

考慮下面的代碼回滾只有嵌套事務:是否有可能用於自動測試

ExecuteSQL("UPDATE ..."); 

using (var t = new TransactionScope()) 
{ 
    ExecuteSQL("UPDATE ..."); 

    if (SomeCondition) 
     t.Commit(); 
    else 
     t.Rollback(); 
} 

var result = ExecuteSQL("SELECT ..."); 

然後我們編寫使用外的TransactionScope回滾每次測試後的變化自動測試:

[TestInitialize] 
public override void Initialize() 
{ 
    _transaction = new TransactionScope(); 
} 

[TestCleanup] 
public override void Cleanup() 
{ 
    _transaction.Dispose(); 
} 

SomeConditionfalse時,不可能寫出正確的測試案例。由於嵌套事務ROLLBACK回滾了包括第一個UPDATE語句在內的整個外部事務。

您是否知道任何解決方法?

回答

1

不可以。您可以回滾到保存點,請參閱Exception Handling and Nested Transactions,但這與您想要的不一樣。

你是什麼真的試圖實現?測試應該在類似的生產條件下進行。在內部交易中添加超級交易和測試方法與系統在生產中的表現無關。

0

SQL Server並不真的支持嵌套事務。它只有一個事務,它看到多個start transaction語句,並且在它真正提交之前需要多個commit transaction語句。

作爲一種解決方法,請勿嵌套事務。可以在不同的連接上同時運行兩個事務。

0

未命名的回滾會將所有反饋回滾到堆棧頂部。

,它可以幫助的唯一事情是使用命名SAVE TRANSACTION

警告:不與分佈式事務工作。

+0

是否有任何使用SAVE TRANSACTION的TransactionScope包裝? – alexey

+0

@alexey嘗試將命令本身傳遞給服務器,而不使用任何包裝器 –

+0

@alexey ...並注意,TransactionScope默認情況下爲SERIALIZABLE,非常易於使用8-) –

相關問題