每次安裝Web測試環境的一項重要檢查工作,是要確認Web與SQL間的DTC連線暢通,在經驗裡這是件眉眉角角很多的任務,光從我過去針對它寫過的KB、文章數量就可見一斑。

測試DTC通不通的方法,除了直接執行引用DTC的程式之外,還可以用MS的DTCPing工具。不過,這次介紹如何使用我寫的小工具Mini C# Lab來測試DTC。

測試原理請大家參考".NET 分散式交易程式開發FAQ(PDF)"一文,用Mini C# Lab跑以下的小程式,在TransactionScope中對SQL建立兩條連線會觸發使用DTC,因此若沒設好,第二個查詢會傳回錯誤。(【2010-11-12更新】以下寫法應用於SQL 2008時,會因連線字串相同而不觸發DTC,改良做法請見這裡)

using System;
using System.Data;
using System.Data.SqlClient;
using System.Transactions;
//REFDLL System.Data;System.Xml;System.Transactions
 
public class CSharpLab
{
    private static void querySqlServer() 
    {
        string cnStr =  "Data Source=theSql;User Id=theUser;Password=thePasswd;";
        using (SqlConnection cn = new SqlConnection(cnStr))
        {
            SqlCommand cmd = new SqlCommand("SELECT getdate() as D", cn);
            cn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            dr.Read();
            Console.WriteLine(dr["D"]);
            cn.Close();
        }
    }
 
    public static void Test()
    {
        using (TransactionScope tx=new TransactionScope()) 
        {   
            querySqlServer();
            querySqlServer();
            tx.Complete();
        }
    }
}

 

以本次測試為例,因為"Network DTC Access"沒啟動,得到以下錯誤:

意外發現,錯誤訊息還挺明確的,本機Network DTC Access沒開時長這樣:

ERROR: Runtime error!
Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool

如果是遠端那台沒開啟長這樣:

ERROR: Runtime error!
The partner transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D025)

常被雞同鴨講聲東擊西指鹿為馬不知所云的錯誤訊息氣到吐血,看到這麼精確的訊息,就甘心A。


Comments

# by leeyun

您好,我最近做DTC方面的一个项目,碰见一个问题,向您请教。 code总是报“与基础事务管理器的通信失败” 用msdtcping测试通过,使用您的mini lab也是报上面的错误 谢谢~ mini lab 的cod如下: public class CSharpLab { private static void querySqlServer() { string cnStr = "Data Source=192.168.10.166;Initial Catalog=ATC_WOS;Persist Security Info=True;User ID=sa;Password=sunfast"; using (SqlConnection cn = new SqlConnection(cnStr)) { SqlCommand cmd = new SqlCommand("SELECT getdate() as D", cn); cn.Open(); SqlDataReader dr = cmd.ExecuteReader(); dr.Read(); Console.WriteLine(dr["D"]); cn.Close(); } } public static void Test() { using (TransactionScope tx=new TransactionScope()) { querySqlServer(); querySqlServer();////注释掉该行可以通过 tx.Complete(); } } }

# by Jeffrey

to leeyun, 使用分散式交易要注意的小地方挺多的,沒有設定好就會得到以上的訊息。我在http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/05/09/distributed-transactoin-with-dotnet-faq.aspx 一文中有整理我遇到的一些常見問題、檢查步驟及解決方式,你可以參考看看。

# by leeyun

谢谢您的回复,我看过你的相关的所有文章,那个faq也全看过, 其我这边得到的错误,英文是"Communication with the underlying transaction manager has failed. ".我用dtcping测试是正确的啊,所以不太明白是哪儿有问题。 我这边的环境是 "web服务器 win2003 sp2" + "DB服务器 win2003 sp3", 两边的防火墙全关闭了,对于数据的操作都是在DB服务器的一个数据库上面,只是多次open,close 数据库的连接

# by Jeffrey

to leeyun, TransactionScope中用不同連線open同一資料庫,就會構成啟用分散式交易的條件,因此,第二次的失敗正是因為企圖呼叫DTC沒成功的緣故。dtcping從兩台機器互相測試都成功嗎? 如果是這樣還無法連通就挺少見的。 我再提供一個測試,請從web上開cmd.exe測ping db的機器名稱,從db上試ping web的機器名稱,一定要用機器名稱,不可用IP取代。我的經驗中,只要任一方無法透過這種方式找到到對方,就可能導致DTC失敗。

# by leeyun

这个是Web SERVER 中 dtcping记录的log Platform:Windows 2003 Windows 2003 environment is detected: Reading MSDTC settings from local registry: Security settings for DTC under Windows 2003 NetworkDtcAccess :true NetworkDtcAccessAdmin :true NetworkDtcAccessClients :true NetworkDtcAccessTransactions:true NetworkDtcAccessTip :true XaTransactions :true DomainControllerState :false AccountName :NT Authority\NetworkService TurnOffRpcSecurity :true IP Configure Information Host Name . . . . . . . . . : lizhongbo DNS Servers . . . . . . . . : 192.168.10.53 202.96.199.133 Node Type . . . . . . . . . : NetBIOS Scope ID. . . . . . : IP Routing Enabled. . . . . : no WINS Proxy Enabled. . . . . : no NetBIOS Resolution Uses DNS : no Ethernet adapter {24DAC1AD-E48E-4972-9972-C0350E2D4849}: Description . . . . . . . . : Marvell Yukon 88E8057 PCI-E Gigabit Ethernet Controller Physical Address. . . . . . : 00-01-6C-41-F6-09 DHCP Enabled. . . . . . . . : no IP Address. . . . . . . . . : 192.168.80.187 Subnet Mask . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . : 192.168.80.254 DHCP Server . . . . . . . . : 255.255.255.255 Primary WINS Server . . . . : 0.0.0.0 Secondary WINS Server . . . : 0.0.0.0 Lease Obtained. . . . . . . : Thu Jan 01 00:00:00 1970 Lease Expires . . . . . . . : Thu Jan 01 00:00:00 1970 10-08, 11:29:41.203-->Error(0x2) at NetName.cpp @245 10-08, 11:29:41.203-->-->fopen for host file 10-08, 11:29:41.203-->-->2(The system cannot find the file specified.) ++++++++++++hosts ++++++++++++ 127.0.0.1 localhost 192.168.10.166 test-atc ++++++++++++++++++++++++++++++++++++++++++++++ DTCping 1.9 Report for LIZHONGBO ++++++++++++++++++++++++++++++++++++++++++++++ RPC server is ready 10-08, 11:30:06.343-->RPC server:LIZHONGBO received following information: Network Name: lizhongbo Source Port: 1484 Partner LOG: TEST-ATC412.log Partner CID: 52DC8165-A3C4-4751-8D7B-967D88C8D0CB ++++++++++++Start Reverse Bind Test+++++++++++++ Received Bind call from TEST-ATC Network Name: lizhongbo Source Port: 1484 Hosting Machine:LIZHONGBO 10-08, 11:30:06.359-->Trying to Reverse Bind to TEST-ATC... Test Guid:52DC8165-A3C4-4751-8D7B-967D88C8D0CB Name Resolution: TEST-ATC-->192.168.10.166-->test-atc Reverse Binding success: LIZHONGBO-->TEST-ATC ++++++++++++Reverse Bind Test ENDED++++++++++ 10-08, 11:30:06.421-->Called POKE from Partner:TEST-ATC Network Name: lizhongbo Source Port: 1484 Hosting Machine:LIZHONGBO ++++++++++++Validating Remote Computer Name++++++++++++ 10-08, 11:32:15.562-->Start DTC connection test Name Resolution: test-atc-->192.168.10.166-->test-atc 10-08, 11:32:15.562-->Start RPC test (LIZHONGBO-->test-atc) RPC test is successful Partner's CID:52DC8165-A3C4-4751-8D7B-967D88C8D0CB ++++++++++++RPC test completed+++++++++++++++ ++++++++++++Start DTC Binding Test +++++++++++++ Trying Bind to test-atc 10-08, 11:32:15.578-->LIZHONGBO Initiating DTC Binding Test.... Test Guid:1753F053-322F-4F4C-8098-6B334EAF5F1B Received reverse bind call from test-atc Network Name: lizhongbo Source Port: 1484 Hosting Machine:LIZHONGBO Binding success: LIZHONGBO-->test-atc ++++++++++++DTC Binding Test END+++++++++++++

# by leeyun

DB Server上面 dtcping记录的log Platform:Windows 2003 Windows 2003 environment is detected: Reading MSDTC settings from local registry: Security settings for DTC under Windows 2003 NetworkDtcAccess :true NetworkDtcAccessAdmin :true NetworkDtcAccessClients :true NetworkDtcAccessTransactions:true NetworkDtcAccessTip :true XaTransactions :true DomainControllerState :false AccountName :NT Authority\NetworkService TurnOffRpcSecurity :false IP Configure Information Host Name . . . . . . . . . : test-atc DNS Servers . . . . . . . . : 192.168.10.53 202.96.199.133 Node Type . . . . . . . . . : NetBIOS Scope ID. . . . . . : IP Routing Enabled. . . . . : no WINS Proxy Enabled. . . . . : no NetBIOS Resolution Uses DNS : no Ethernet adapter {6B7108C8-74ED-421F-9F85-B726B5630468}: Description . . . . . . . . : Broadcom NetLink (TM) Gigabit Ethernet Physical Address. . . . . . : 00-1C-25-C6-62-A1 DHCP Enabled. . . . . . . . : no IP Address. . . . . . . . . : 192.168.10.166 Subnet Mask . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . : 192.168.10.254 DHCP Server . . . . . . . . : 255.255.255.255 Primary WINS Server . . . . : 0.0.0.0 Secondary WINS Server . . . : 0.0.0.0 Lease Obtained. . . . . . . : Thu Jan 01 00:00:00 1970 Lease Expires . . . . . . . : Thu Jan 01 00:00:00 1970 10-07, 23:50:54.515-->Error(0x2) at NetName.cpp @245 10-07, 23:50:54.515-->-->fopen for host file 10-07, 23:50:54.515-->-->2(The system cannot find the file specified.) ++++++++++++hosts ++++++++++++ 127.0.0.1 localhost 192.168.80.141 rqwveutgj3txzdq 192.168.10.54 ad2 192.168.80.187 lizhongbo ++++++++++++++++++++++++++++++++++++++++++++++ DTCping 1.9 Report for TEST-ATC ++++++++++++++++++++++++++++++++++++++++++++++ RPC server is ready ++++++++++++Validating Remote Computer Name++++++++++++ 10-07, 23:51:02.546-->Start DTC connection test Name Resolution: lizhongbo-->192.168.80.187-->lizhongbo 10-07, 23:51:02.546-->Start RPC test (TEST-ATC-->lizhongbo) RPC test is successful Partner's CID:1753F053-322F-4F4C-8098-6B334EAF5F1B ++++++++++++RPC test completed+++++++++++++++ ++++++++++++Start DTC Binding Test +++++++++++++ Trying Bind to lizhongbo 10-07, 23:51:02.562-->TEST-ATC Initiating DTC Binding Test.... Test Guid:52DC8165-A3C4-4751-8D7B-967D88C8D0CB Received reverse bind call from lizhongbo Network Name: test-atc Source Port: 1564 Hosting Machine:TEST-ATC Binding success: TEST-ATC-->lizhongbo ++++++++++++DTC Binding Test END+++++++++++++ 10-07, 23:51:38.234-->RPC server:TEST-ATC received following information: Network Name: test-atc Source Port: 1564 Partner LOG: LIZHONGBO1368.log Partner CID: 1753F053-322F-4F4C-8098-6B334EAF5F1B

# by leeyun

再次谢谢您的回复,如果您不介意的话,可以mail回复我。 我的mail:persialee@hotmail.com 谢谢~ LeeYun

Post a comment