2011-07-11 60 views
1

我正在使用圍繞Web服務和數據庫的system.Transactions。當我無法連接到遠程數據庫時,事務不會回滾。所以數據將被插入到Web服務的數據庫中,同時應該被回滾。我在寫自己的Web服務代碼。分佈式事務協調器服務已運行,並且我在組件服務中設置了其他參數。爲什麼事務不能在Web服務和數據庫之間回滾?

最好說Web服務和客戶端都在同一臺機器上。

using System.Transactions; 

try 
{ 
    using (TransactionScope tscope = new TransactionScope()) 
    { 
     //----- Web service 
     IdentificationSystem.Service Identify = new IdentificationSystem.Service(); 
     Identify.InsertWorkshopInfo(BosWorkshop.WpSvUserName,   BosWorkshop.WpSvPassword,BosWorkshop.WkIcode 
     //------------- 
     //------------------ connect to a remote DB 
     //--------- My Sql Query 
     string sq= "SET XACT_ABORT ON;update tbl_kargah " + 
      "set [email protected] "+ 
      "where [email protected]_kargah "+ 
      "insert into dbo.tbl_WorkshopCodes (co_kargah,Code_ostan,Wpcode) "+ 
      "values(@Co_kargah,@Code_ostan,@WpCode) "+ 
      "insert into LnkWorkerSystem.Bazresi_kar.dbo.tbl_Workshopcodes(Co_Kargah,Code_Ostan,WpCode) "+ 
      "values(@Co_kargah,@Code_ostan,@WpCode) "; 

     //-------- 
     SqlCon = new SqlConnection(@BoBaz.BazConnectionString); 
     SqlCon.Open(); 
     SqlCom = new SqlCommand(sq, SqlCon); 
     SqlCom.Parameters.Add("@co_kargah", SqlDbType.BigInt).Value = BoBaz.BazCodeKargah; 
     SqlCom.Parameters.Add("@Code_ostan", SqlDbType.NVarChar).Value = BoBaz.BazCodeOstan; 
     SqlCom.Parameters.Add("@WpCode", SqlDbType.NChar).Value = BoBaz.WpRealCode; 
     SqlCom.ExecuteNonQuery(); 
     SqlCon.Close(); 

     tscope.Complete(); 
    } 
} 
catch(Exception ex) 
{ 
    string s = ex.Message; 
} 

參考這個問題,請:Transaction

+0

代碼scaries我有點.. –

+0

很抱歉,但我不得不將它張貼 –

+0

你有一個未完成的return語句在SQL之前... – cjk

回答

1

編輯:

經過大量的對話,似乎您使用的是ASMX Web服務。這些是基本網絡服務,並不支持這種用法。

增加對此的支持是由WCF 在某些模式(不是全部)中提供的,並且需要額外的配置。但是,我個人的建議是:不。分佈式事務對於像本地局域網中的SQL這樣的事情來說是非常棘手的 - 將Web服務添加到組合中,並且通常要求麻煩(我認爲)。

但是,有些人相處得很好 - YMMV。


這是你的錯誤:

catch(Exception ex) 
{ 
    string s = ex.Message; 
} 

你的代碼可能想告訴你什麼是錯的,但你去了,吞下了異常。

我的猜測是分佈式事務中的另一個元素(可能是WCF調用)失敗,導致整個事務處理。例外會告訴你這個

IMO,取出catch完全。如果不好的事情發生,不要隱藏它們,然後想知道發生了什麼。讓它冒泡到最高級別,您現有的(咳嗽)中央錯誤處理將當然將錯誤寫入您經常檢查的錯誤日誌中。

+0

我的問題是:發生異常,但Web服務功能不會回滾 –

+0

@Raymond和您正在使用哪個WCF綁定?並非所有支持事務...您還需要額外的步驟來啓用它們:http://www.codeproject.com/KB/WCF/WCFTransactions.aspx –

+0

我不使用WCF我使用ASMX Web服務 –

相關問題