现在的位置: 首页 > 综合 > 正文

当事务遇到防火墙

2012年02月24日 ⁄ 综合 ⁄ 共 1534字 ⁄ 字号 评论关闭

DotNet2.0的TransactionScope类让事务处理更简单,更轻量级。但最近确遇到一个问题,是打开Windows2003或xp操作系统自带的防火墙时,在打开数据库连接的时候抛出“事务已显示提交或终止”的异常。刚开始还以为是.Net Remoting穿透防火墙存在安全性问题,但后来写了一个控制台的测试程序也是同样问题。
经测试有以下几种情况:
1.没有打开防火墙一切正常
2.打开防火墙但不加事务正常
3.数据库和应用程序在同一机器时正常
4.如果数据库是sql2000的,在打开第一个连接的时候就抛出异常;如果数据库是sql 2005则在打开第二个连接时才抛异常
5.如果是用企业服务EnterpriseServices的自动事务也没有问题

初步判断是因为防火墙阻止msdtc端口通讯的问题,但msdtc好像是动态端口?可能异常信息描述的不是很详细,自己用测试代码一跑就很清楚。

测试代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;

namespace TransactionScopeProject
{
    class Program
    {
        static void Main(string[] args)
        {
            BusinessOperation bo = new BusinessOperation();
            bo.Add();

            Console.WriteLine("press enter to exit");
            Console.Read();
        }
    }

    class BusinessOperation
    {
        public void Add()
        {
            using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
            {
                Do1();

                Do2();
            }
        }

        private void Do1()
        {
            string connectString = "server=192.168.1.110;uid=sa;pwd=;database=www.szguoguo.com";
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();
            }
        }

        private void Do2()
        {
            string connectString = "server=192.168.1.110;uid=sa;pwd=;database=www.szguoguo.com";
            using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();   
            }
        }
    }
}
开启Windows2003或xp自带防火墙的示意图

注,我的测试环境是windows2003+SP1。MSDTC的设置如下:

抱歉!评论已关闭.