2011-11-02 66 views
4

我在兩個不同的網絡Db1和Db2(遠程數據庫)上有一個Web服務器和兩個DB服務器。」事務已在事務範圍內隱式或明確提交或中止

  • DB1:SQL Server 2008 R2中,操作系統:Windows Server 2003的SP2
  • DB2:SQL Server 2000中,操作系統:Windows Server 2003 R2的
  • Web服務器:在Windows Server 2003 R2

我想在這些數據庫中插入兩條不同的記錄,我正在使用TransactionScope

using (TransactionScope tscope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    //open connection db 1 
    //insert into db1 

    //open connection db2 -- the problem is here 
    //insert into db2 

    tscope.Complete(); 
} 

當我跟蹤的源代碼,在第一DATABSE將成功完成,但在第二連接要打開我遇到下面的錯誤。

錯誤:

The transaction has already been implicitly or explicitly committed or aborted.

我已經配置MSDTC,Distributrd事務協調器和每一件事情是確定的。我可以在我的數據庫服務器中有分佈式事務,並且我沒有問題。 TransactionScope有什麼不對?請幫幫我。

第一連接是LINQ到SQL:

DataClassesDataContext Dac = new DataClassesDataContext(); 
Dac.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionCs"].ConnectionString; 
tbl_KargahDistribution Workshop = new tbl_KargahDistribution(); 
Workshop.WpCode = Bodu.WpRealCode; 
Workshop.State = Bodu.BduState; 
Workshop.City = Bodu.BduCity; 
Workshop.Town = Bodu.BduTown; 
Workshop.SubSystem = Bodu.BduSubSystem; 
Dac.tbl_KargahDistributions.InsertOnSubmit(Workshop); 
Dac.SubmitChanges(); 

第二連接是:

Queries Qu = new Queries(); 
SqlCon = new SqlConnection(BoBaz.BazConnectionString); 
SqlCon.Open(); 
string sq = Qu.InsertWorkshopBaseInfo(); 
SqlCom = new SqlCommand(sq, SqlCon); 
+2

您能否包含有關您的連接如何打開的詳細信息? – Kane

+0

你玩過'SqlConnection.BeginTransaction()','Transaction.Current.EnlistVolatile()'等等嗎? – abatishchev

+0

我剛用enlist = false;在第二個連接字符串中,我沒有得到任何錯誤消息,解決了問題。但我認爲當我設置enlist = false;我的第二個連接不會成爲事務的一部分,所以我沒有使用它。 –

回答

0

I have configured MSDTC, Distributrd transaction coordinator and every thing is ok. I can have distributed transaction in My DB server and I have no problem.

這可能是事實,但對於多機DTC最好仔細檢查一下。這個錯誤通常是網絡問題的根源。數據庫可能無法與Web服務器通信(DNS或IP更改問題)或客戶端自己的防火牆可能阻止DTC(檢查Web服務器上的Windows防火牆設置)。

0

當您單步執行代碼時,您是否只注意到這一點?

交易超時並自動回滾是有可能的,因爲您單步執行代碼的時間超過了TransactionScope的超時限制。我認爲默認的超時值是60秒。