2010-08-20 22 views
2

我有2 linq 2 SQL語句我想在事務中(SQL服務器是遠程的,在防火牆等之外)所有其他通信都可以,但是當我在TransactionScope()中包裝這兩條語句時,我開始必須配置我們所做的MSDTC,但後來有防火牆問題(我認爲)有沒有更簡單的方法?簡單事務

的是我想做的事情歸結爲這樣的基礎:(兩者都在引擎蓋下存儲的特效)

using (var transactionScope = new TransactionScope()) 
{ 
    Repository.DataContext.SubmitChanges(); 
    Repository.DataContext.spDoFinalStuff(tempID, ref finalId); 
    transactionScope.Complete(); 
} 

什麼是實現這一目標的最簡單的方法?

編輯:
首先我得到這樣的:事務管理器已禁用其遠程/網絡事務的支持。 (來自HRESULT的例外:0x8004D024) 在我們的服務器上,我按照指示here糾正此問題。但是,說明似乎並不適用於Windows 7(我的開發盒)看到我對上述答案的評論。

糾正問題後(在非win7的盒子上)我得到這個:事務已經被隱式或顯式提交或中止(異常來自HRESULT:0x8004D00E),其中一些使用suggested可能是防火牆問題。

編輯
我剛剛發現遠程數據庫是SQL 2000

回答

0

如果2個更新發送到2個不同的數據庫,.NET transactoinScope類需要MSDTC的幫助來協調的事務。 SQL Server 2005或更高版本,如果兩個更新在同一個數據庫中,則不涉及MSDTC。

MSDTC是在com +組件服務中配置的,選擇你的計算機名稱並選擇屬性,基本上你應該選擇No authentication。

以下鏈接可以幫助

http://support.microsoft.com/kb/306843

http://blogs.msdn.com/b/distributedservices/archive/2008/11/12/troubleshooting-msdtc-issues-with-the-dtcping-tool.aspx

+0

ahhh我剛剛發現遠程服務器正在使用SQL 2000 – Myster 2010-08-22 21:18:51

0

你總是可以創建自己的事務中執行這兩個SP一個新的存儲過程?快速n'髒...

0

TransactionScope是要走的路,如果你不想搞亂SQL。我不熟悉通過防火牆進行交易,並且有任何問題。你能發佈你遇到的異常/錯誤嗎?

如果確實會導致您遇到問題,則可以使存儲過程將其包裝並在包裝的存儲過程中執行事務。

0

當您在交易過程中只需處理一個單一數據庫時,您可以簡單地創建並打開一個新的SqlConnection。這可以防止您需要使用TransactionScope。這裏有一個例子:

using (var con = new SqlConnection("constr")) 
{ 
    con.Open(); 
    using (var tran = con.BeginTransaction()) 
    { 
     using (var context = new YourDataContext(con)) 
     { 
      // Do stuff 
      context.SubmitChanges(); 
      int generatedId = /* get this id */ 
      // Do stuff with id 

      context.SubmitChanges(); 
     } 
    } 
} 

因爲你使用Repository,你必須創建在背景方面,但這個想法是一樣的。並且不要忘記處置數據庫事務和連接。