当事务遇到防火墙
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的设置如下: