posts - 23, comments - 192, trackbacks - 6, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
经验:使用.net 2.0中的TransactionScope碰到的问题

概述:不能在同一个TransactionScope中打开多个连接对象

TransactionScope真的是很方便的,具体的使用也很简单,MSDN上有详细描述。不过我在使用过程中发现了一个问题,那就是无法在同一个TransactionScope中打开多个连接对象。示例代码如下,示例中是连接到同一实例的同一数据库,但连接到不同实例的不同数据库也是同样的结果。

具体原因还需具体分析,我碰到的情况不一定代表就是正确的情况,还请大家批评。

[Test]
public void TestTransactionScope()
{
    using (TransactionScope ts = new TransactionScope())
    {
        string cnstr = @"Data Source=cs1\sqlexpress;Database=fugao_dev;User ID=sa;Password=123;";
        SqlConnection cn1 = new SqlConnection(cnstr);
        cn1.Open();

        using (TransactionScope ts2 = new TransactionScope())
        {
            SqlConnection cn2 = new SqlConnection(cnstr);
            cn2.Open();
        }
    }

}

[Test]
public void TestTransactionScopeA()
{
    using (TransactionScope ts = new TransactionScope())
    {
        string cnstr = @"Data Source=cs1\sqlexpress;Database=fugao_dev;User ID=sa;Password=123;";
        SqlConnection cn1 = new SqlConnection(cnstr);
        cn1.Open();


        SqlConnection cn2 = new SqlConnection(cnstr);
        cn2.Open();
    }

}

以上测试都抛出了异常,并且运行时间很长,象死机一下
System.Transactions.TransactionManagerCommunicationException : 与基础事务管理器的通信失败。
  ----> System.Runtime.InteropServices.COMException : 对 COM 组件的调用返回了错误 HRESULT E_FAIL。
Tag标签: ado.net

Feedback

#1楼    回复  引用  查看    

2008-04-14 13:26 by jillzhang      
http://www.cnblogs.com/jillzhang/archive/2008/02/20/1075057.html

#2楼    回复  引用  查看    

2008-04-14 13:31 by jillzhang      
你的问题是分布式事务DTC的设置问题,有解决办法

#3楼    回复  引用  查看    

2008-04-14 14:19 by 心悦      
在组件服务那里启动分布式事务就行了。。。

#4楼    回复  引用  查看    

2008-04-14 14:59 by 代码乱了      
关注

#5楼    回复  引用  查看    

2008-04-14 15:38 by virus      
我的机器没有报错,测试代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Transactions;
using System.Data;
using System.Data.SqlClient;

namespace Test1
{

class Test1
{
public static void Main()
{

using (TransactionScope scope = new TransactionScope())
{
string strconn="server=.;uid=virus;pwd=;database=northwind";
SqlConnection conn = new SqlConnection(strconn);
conn.Open();

SqlConnection conn1 = new SqlConnection(strconn);
conn1.Open();

scope.Complete();
}

Console.WriteLine("complete!");
Console.ReadLine();


}
}
}
环境,是vs2005+SQL2000
如果没有打开DTC服务的话,会提示没有打开,你没有加scope.Complete();这句,要提交的。就算没有加这句也不会出现你说的抛异常什么的,运行正常。可以打开两个连接,三个我也测试了,运行正常。

#6楼 [楼主]   回复  引用  查看    

2008-04-14 17:02 by andy.wu      
@ jillzhang

看了你的文章,受益了。谢谢。

@ others
多谢各位的指点。

#7楼    回复  引用    

2008-04-14 17:09 by graystar [未注册用户]
与基础事务管理器的通信失败。就是你机器上的分布式服务没配好

#8楼    回复  引用  查看    

2008-04-14 17:13 by peace      
using (ESTransactionScope t = new ESTransactionScope())//标明事务范围
{
try
{

for (int i = 0; i < this.grdBidders.Rows.Count; i++)
{
if (chkBox.Checked)
{
//比如更新操作
UpdateStatus(bidderno);
//插入操作
//这里应该可以放逻辑才对 和具体的数据连接应该是无关的


}
}
t.Complete();

}
catch
{
Fun.Alert("操作失败!");
}
}

我这是在ORACEL里这么用的,不知道SQL SERVER好像也能达到这样的效果

#9楼    回复  引用  查看    

2008-04-15 08:47 by 李战      
飞过

#10楼    回复  引用  查看    

2008-04-15 09:24 by 笑疯^_^      
楼上,你的小猴子怎么加上去的?

#11楼    回复  引用    

2008-05-29 08:52 by 嘎嘎嘎 [未注册用户]
测试小猴子<img src="http://www.cnblogs.com/Emoticons/yoyocici/224023586.gif" alt="" />飞过

#12楼    回复  引用    

2008-05-29 08:52 by 嘎嘎嘎 [未注册用户]
测试失败。。

#13楼    回复  引用  查看    

2008-06-30 10:55 by 李彦      
有几个问题:
第一,TransactionScope类如果用于单个数据库连接上,就跟SqlTransaction没有什么区别了,而且还不如SqlTransaction执行效率高。
第二,TransactionScope类如果用于多个数据库连接,则是分布式事务了,需要MSDTC服务支持,本机测试时,需要运行net start msdtc启动此服务。
第三,据本人测试,发现SQL Server 2005 Express版不支持TransactionScope,不知道是不是没有配置好。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
成果网帮您增加网站收入


相关链接: