SQL 2008 / Windows 2008 之 MSDTC 注意事項

過去累積不少MSDTC的茶包處理經驗,也想出了用Mini C# Lab測試MSDTC的技巧。原本射MSDTC茶包還算得心應手,但最近又踢了鐵板,學到新的心得:

  1. SQL 2008啟動分散式交易的時機改變
    依過去的研究心得,只要不是用同一個SqlConnection物件執行查詢,即便連線字串完全相同,SQL 2005也會啟用分散式交易,所以在Mini C# Lab MSDTC測試中,就用了這點特性故意引發分散式交易進行測試。但今天被騙很慘,使用Mini C#測試看來MSDTC正常,但Web程式卻一直傳回分散式交易失敗!
    追了一陣子才赫然發現,原來SQL 2008的LTM容忍度變大了,即便使用不同的SqlConnection,只要連線字串相同,還是適用LTM! 所以我一直用歪尺在量東西,難怪世界是歪的。
    因此,我決定修正Mini C# Lab MSDTC的程式碼,加入
    cnStr += "Application Name=" + Guid.NewGuid().ToString();
    故意造成連線字串永遠不會相同來避開SQL 2008的LTM,並且在結果中顯示Transaction.Current.TransactionInformation.DistributedIdentifier以協助確認有動用到MSDTC!
    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=MyServer;User Id=MyUser;Password=MyPwd;";
            cnStr += "Application Name=" + Guid.NewGuid().ToString();
            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();
                Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                Console.WriteLine(Transaction.Current.TransactionInformation.DistributedIdentifier);
                tx.Complete();
            }
        }
    }

    新的執行結果如下,如果發現最後一組GUID是00000000-0000-0000-0000-000000000000代表分散式交易根本沒有啟動,千萬不要被結果給騙了!! 

    Built successfully in 323ms!
    Prepare to run...
    ==================================================
    11/8/2010 12:57:00 PM
    11/8/2010 12:57:00 PM
    c59168c5-dc86-4ca5-be5e-316af2da7521:32
    00000000-0000-0000-0000-000000000000
    ==================================================
    Execution time: 8 ms

    啟用MSDTC的狀況下,兩組GUID應該都要有值才合理!

    Built successfully in 324ms!
    Prepare to run...
    ==================================================
    11/8/2010 12:59:35 PM
    11/8/2010 12:58:36 PM
    c59168c5-dc86-4ca5-be5e-316af2da7521:33
    df4f40aa-9d43-4b86-b64d-4afbabfd22c3
    ==================================================
    Execution time: 67 ms

  2. Windows 2008 防火牆Issue
    發現MSDTC不通後,又匆忙找原因。最後發現問題出在防火牆設定,預設MSDTC是被關閉的! 啟用後,終於解除了Windows 2008 R2 MSDTC的封印,呼~~~

歡迎推文分享:
Published 12 November 2010 06:43 PM 由 Jeffrey



意見

# AA said on 12 November, 2010 08:40 AM

請問故意引發分散式交易的道理在哪裡? 純粹好奇嗎?

# Jeffrey said on 12 November, 2010 09:19 AM

to AA, 引發分散式交易的目的在於驗證該Client與SQL Server間的相關設定妥當,確認該環境能支援分散式交易。

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 

搜尋

Go

<November 2010>
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
 
RSS
【工商服務】
OrcsWeb: Windows Server Hosting
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication