随笔-145  评论-311  文章-50  trackbacks-17

当事务遇到防火墙

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的设置如下:

posted on 2006-12-20 21:32 蝈蝈 阅读(2471) 评论(14) 编辑 收藏

评论:
#1楼 2006-12-20 21:43 | idior      
用http协议才是根本的解决方法,呵呵。
 回复 引用 查看   
#3楼 2006-12-20 23:39 | mian[未注册用户]
原来是防火墙的问题,我以前也试过不行,后来就不用事务了!
 回复 引用   
#4楼 2006-12-21 09:54 | guoguo[未注册用户]
to idior,MSDTC还能走http协议?
to RicCC 照着做了还是不行,你遇到过是这么来解决的么?
to mian 不用事务了,强!

 回复 引用   
#5楼 2006-12-21 11:32 | zhouzhou[未注册用户]
首先:开防火墙的时候要允许msdtc.exe,这个估计大家都知道了
其次:一定要保证2台机器能够通过机器名互相访问,而且不是修改hosts文件的方式就能访问,切记切记

另:这个方法也是问MS的技术支持才知道的,但却找不到相关的文章,连MS的新闻组中也有没有回答的问题(至少我在寻求答案的时候如此)

 回复 引用   
#6楼 2006-12-21 12:07 | Wisdom-zh      
防火墙的问题多啊, 唉!
现在甚至连一般的杀毒软件的监控, 都导致软件出现很多异常情况!

 回复 引用 查看   
#7楼 2006-12-21 16:41 | guoguo[未注册用户]
zhouzhou
能不能详细说一下怎么做呀,比较急。
没太明白你说的“保证2台机器能够通过机器名互相访问,而且不是修改hosts文件的方式就能访问,”是啥意思,我们是域模式,如果不跨网断,用机器名相互访问是没有问题。跨网段就会修改hosts文件。我目前测试的是同一网段,但还是不可以呢,如果真实布署在客户环境,又怎么来解决 呢?

 回复 引用   
#8楼 2006-12-21 16:55 | Riancy[未注册用户]
事务放到数据库中实现不是更好?
 回复 引用   
#9楼 2006-12-22 09:25 | RicCC      
MSDTC的问题经常是比较怪异的,我用来解决问题的方案别人就不一定可以,因为原因可能不一样
zhouzhou所说的2是指A、B两台机器hosts文件里面都不存在对方的项,然后A、B两台机器上互相Ping对方的机器名,需要保证ping没有问题。这种情况一般发生在网段不一样,或者A、B机器有一台在域里有一台不在域里等等情况。跨网段的时候不仅跟A、B机器上本身防火墙的配置有关,可能还和域里的路由、防火墙、代理的配置有关,需要允许RPC调用,开放MSDTC端口。

 回复 引用 查看   
#10楼 2006-12-22 23:28 | Leem[未注册用户]
这个问题在我之前开发的一个项目中也折腾了很久,具体按如下操作即可解决:
第一步:
--------------------
win2003缺省禁用远程/网络事务,启用的步骤如下:
启用网络 DTC 访问的步骤
1. 单击“开始”,指向“控制面板”,然后单击“添加/删除程序”。
2. 单击“添加/删除 Windows 组件”。
3. 选择“应用程序服务器”,然后单击“详细信息”。
4. 选择“启用网络 DTC 访问”,然后单击“确定”。
5. 单击“下一步”。
6. 单击“完成”。
7. 停止分布式事务协调器服务,然后重新予以启动。
8. 停止参与分布式事务的任何资源管理器服务(如 Microsoft SQL Server 或 Microsoft Message Queue Server),然后重新予以启动。
--------------------------------
第二步:
--------------------------------
设置MSDTC:控制面板->管理工具->组件服务->我的电脑->右键->属性->MSDTC->安全配置(Security Configuration)->打开Network DTC Access 同时打上
Allow Inbound ,Allow Outbound ,No Authentication Required,Enable Transaction Internet Protocol[TIP] Transaction
---------------------------------
第三步:将MSDTC程序添加入Windows防火墙

注意:两台参与分布事务的机器都需按如上操作设置。如果还有问题,则重启机器。

 回复 引用   
#11楼 2006-12-23 12:30 | 蝈蝈[匿名][未注册用户]
to Leem
感谢你耐心和仔细的奉献。
对于两台参与分布式事务的机器如果都是windows 2003+sp1暂时没有测试过。
但我测试的环境是数据库服务器是windows 2000+sp4,应用服务器是windows 2003+sp1。对于数据库服务器没有防火墙,所以没有也不需要进行任何设置,对吧。对于应用服务器已经设置了二步,请看上图。将MSDTC程序加入windows防火墙没有,只是开通了msdtc的端口,主要是不知道msdtc运行的宿主程序是哪个。
我再去试试,希望你能关注。

 回复 引用   
#12楼 2006-12-23 12:32 | 蝈蝈[匿名][未注册用户]
需要说明的一点是防火墙中增加了组件服务程序,因为打开组件服务程序点击我的电脑时防火墙就提示是否要阻止或开启。我选择了开启。
 回复 引用   
#13楼 2006-12-26 20:33 | 蝈蝈[匿名][未注册用户]
今天又按leem的检查了系统设置并在防火墙中加入了msdtc.exe程序,还是不行。
补充如果数据库是sql 2005时错误描述:与基础事务通讯失败;sql 2000错误描述:分布式事务已提交或已取消。
sql 2005是在打开第二次连接时报错,sql 2000是在打开第一次连接就报错。

 回复 引用   
#14楼 2008-06-17 00:13 | shcity      
这个问题也困扰了我一年多,呵呵.不过还是最终给解决了.我的博客里有相关文章.大家可以参考.
 回复 引用 查看   
基本资料:
蝈蝈
QQ:*******
MSN:hotsoho#msn.com
2004年09月30日
Dial Up
昵称:蝈蝈
园龄:7年4个月
粉丝:1
关注:0
<2006年12月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

搜索

 
 

常用链接

随笔分类

随笔档案

文章分类

文章档案

相册

精品收藏

友情链接

积分与排名

  • 积分 - 124444
  • 排名 - 804

最新评论

阅读排行榜

评论排行榜

推荐排行榜