2011-11-30 189 views
0

我在DAL下面的方法:的TransactionScope不正確commiting交易

public void SavePlan() 
{ 
    using (TransactionScope scope = 
      new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
     CallSaveDataProc(); 
     CallLogMsgProc(); 
     scope.Complete(); 
    } 
} 

我特意放在CallLogMsgProc一個COMMIT的事務,而無需創建一個交易。這導致從CallLogMsgProc程序拋出SQLException,並且scope.Complete()從不執行。

但是,在我的數據庫中,我仍然看到由第一種方法CallSaveDataProc保存的記錄。難道我做錯了什麼?

+0

你可以把來自CallSaveDataProc(),CallLogMsgProc()和你已經使用的任何存儲過程的代碼? – Fabio

回答

0

啓動/提交事務必須配對,並且最好每對應理想地在相同範圍內(儘管每對不必與另一對相同)。

所以,你必須開始通過新的TransactionScope交易,然後在你的存儲過程Commitwhich will save the work ...如你所看到的),接着是試圖通過TransactionScope犯「看到」交易的情況下,現在已經失效了。

+0

因此,即使父級最終回滾,子存儲過程中的提交也會保存數據?我認爲SQL中的存儲過程總是遵守父事務。 –

+0

@IftikharAli - SQL Server不支持嵌套事務,所以無論你做什麼(例如提交/回滾),它都會影響單個事務。 – Kit