在使用TransactionScope时 出错。
以下是使用TransactionScope 这个的测试代码一周了,问题仍然没有解决,希望大家指教。
应用程序服务器与数据库服务器分别在不同的机器上。
string connectionString = @"Data Source=server\sql2005;Initial Catalog=DataTest;User ID=sa;Password=123456;enlist=true";
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
SqlParameter[] parameters =
{
new SqlParameter("@UserName", SqlDbType.NVarChar,50),
new SqlParameter("@Fund", SqlDbType.Money)
};
parameters[0].Value = "admin";
parameters[1].Value = 12.0;
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "User_UpdateFund";
cmd.Parameters.AddRange(parameters);
conn.Open();
cmd.ExecuteNonQuery();
}
using (SqlConnection conn1 = new SqlConnection(connectionString))
{
SqlParameter[] parameters1 =
{
new SqlParameter("@From", SqlDbType.NVarChar,50),
new SqlParameter("@To",SqlDbType.NVarChar,50),
new SqlParameter("@Fund", SqlDbType.Money)
};
parameters1[0].Value = "admin";
parameters1[1].Value = "agent";
parameters1[2].Value = 12.0;
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = conn1;
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.CommandText = "FundLog_Add";
cmd1.Parameters.AddRange(parameters1);
conn1.Open();
cmd1.ExecuteNonQuery();
}
ts.Complete();
Feedback
未处理 System.Transactions.TransactionManagerCommunicationException
Message="与基础事务管理器的通信失败。"
Source="System.Transactions"
StackTrace:
在 System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken)
在 System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
在 System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
在 System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
在 System.Transactions.Transaction.Promote()
在 System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction)
在 System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
在 System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
在 System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
在 System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
在 System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
在 System.Data.SqlClient.SqlConnection.Open()
在 TransactionScopteConsole.Test.Add() 位置 C:\Documents and Settings\Administrator\桌面\事务测试\TransactionScopteConsole\Test.cs:行号 49
在 TransactionScopteConsole.Test.Run() 位置 C:\Documents and Settings\Administrator\桌面\事务测试\TransactionScopteConsole\Test.cs:行号 27
在 TransactionScopteConsole.Program.Main(String[] args) 位置 C:\Documents and Settings\Administrator\桌面\事务测试\TransactionScopteConsole\Program.cs:行号 17
在 System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()
各位别猜了,楼主百分百没有配置msdtc的安全配置。
不是忘了启动Network DTC Access,就是忘了Client And Administration,要不就是忘了设置Transaction Manager Communication.
btw:TransactionScope是垃圾,N宗罪。建议楼主还是用CommittableTransaction手工Enlist吧。另,鉴于FW2.0的SQLClient有俩致命bug在分布式事务上(不知道那俩补丁公开了没有),没事还是尽量避免分布式事务吧。
@rosanshao
只能使用一个Connection对象,不能使用两个,说明你的本地事务在提升成分布式事务时失败.
从微软下个DTCPing,先排查排查.
btw:应用程序服务器/Connection对应的服务器,这些所有的MSDTC配置都确认过?
to Nineteen@newsmth
我确认应用程序服务器/Connection对应的服务器,这些所有的MSDTC都配置过,具体的配置我是按照http://www.cnblogs.com/zhang3533/archive/2007/07/15/818604.html 其他的配置也试过些,都是在第二connection Open时出现的这个错误,能不能具体说明一下,要实现分布式事务MSDTC怎么配置。如果这样
string connectionString = @"Data Source=server\sql2005;Initial Catalog=DataTest;User ID=sa;Password=123456;enlist=true";
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
SqlParameter[] parameters =
{
new SqlParameter("@UserName", SqlDbType.NVarChar,50),
new SqlParameter("@Fund", SqlDbType.Money)
};
parameters[0].Value = "admin";
parameters[1].Value = 12.0;
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "User_UpdateFund";
cmd.Parameters.AddRange(parameters);
conn.Open();
cmd.ExecuteNonQuery();
} ts.Complete();
}测试是通过了的。加上第二个Connection时就出现错误。
楼主问题找到了吗?我也遇到了相同的问题,数据库服务器是在公司另一个网段上的,在事务中使用一个连接没有问题,使用两个连接就会出现"与基础事务管理器的通信失败"的异常,但奇怪的是如果用我同事的电脑做数据库服务器,(同事电脑和我的电脑在同一个网段)就没有问题,一切都能通过了,疑惑中....
确保2台机器可以使用机器名互相访问(ip不算,修改hosts文件也不算)!
这是个很BT的问题,哈哈。
@rosanshao
DTCPing去测试一下.
你要确认所有服务器之间都可以通过机器名访问.晚上blog一把关于分布式事务和TransactionScope,来看偶的blog吧:)
楼主,我的问题已经找到,出错原因是本地计算机与数据库服务器之间Telnet端口135或RPC被禁用,MSDTC服务升级为分布式事务时是依赖于RPC的.
用 Telnet IP 135 在你本地连接数据库服务器,同样,在数据库服务器连接你的机器,检查是否可以连通
如果,有一端不能连通,找你们公司的网管将不能连通的那一端的Telnet端口打开,并允许RPC协议.
我的问题就这么解决的,)_(
qy1141 你的联系方式是什么,QQ是多少?
我的配置 telnet ip 135是都是通的,但是还是不行。RPC也启用了的。
Most is MSDTC Secuity Config problem.If you config all right,be sure your two computer in the same Workgroup.IT'S VERY IMNPORTANT.
The two computer is not in the same Workgroup.没有在同一工作组就不行吗?
RPC test is successful
++++++++++++RPC test completed+++++++++++++++
++++++++++++Start DTC Binding Test +++++++++++++
Trying Bind to zdit
Received reverse bind call from zdit
Binding success: ZDIT-SP01-->zdit
++++++++++++DTC Binding Test END+++++++++++++
++++++++++++Start Reverse Bind Test+++++++++++++
Received Bind call from zdit
Trying Reverse Bind to zdit
Reverse Binding success: ZDIT-SP01-->zdit
现在两台机器已经想到能够Ping通了,但是使用了两个Connection仍然失败。难道就只能使用一个Connection吗?
不晓得你现在解决了没?我也遇到了同样的问题.汗...
真是奇怪,PetShop用了两个Sqlconnection可以