我前一段时间做了一些测试,但从未弄清楚如何使这项工作成功。

这些成分:

  • COM +事务对象(在VB6中开发)
  • IIS中的.Net Web应用程序(带事务)...
    调用COM +组件
    更新SQL数据库中的一行

测试:

运行.Net应用程序并强制执行异常。

结果:

从.Net应用程序进行的更新回滚。
COM +对象所做的更新不会回滚。

如果我从旧的ASP页面调用COM +对象,则回滚可以正常工作。

我知道有些人可能会想“什么?!COM +和.Net你一定不在乎!”,但是在这个世界上仍有一些地方仍然有很多COM +组件。 如果有人遇到过这种情况,并且你想出如何使这项工作,我只是好奇。

===============>>#1 票数:2 已采纳

因为VB和.NET将使用不同的SQL连接(并且无法使ADO和ADO.NET共享相同的连接),所以您唯一的可能是登记DTC(分布式事务协调器)。 DTC将协调两个独立的事务,以便它们一起提交或回滚。

从.NET ,EnterpriseServices管理COM +功能,例如DTC。 在.NET 2.0和转发版中,您可以使用System.Transactions命名空间,这会使事情变得更好。 我认为这样的事情应该有效(未经测试的代码):

void SomeMethod()
{
    EnterpriseServicesInteropOption e = EnterpriseServicesInteropOption.Full;
    using (TransactionScope s = new TransactionScope(e))
    {
        MyComPlusClass o = new MyComPlusClass();

        o.SomeTransactionalMethod();
    }
}

我对此并不熟悉,在这一点上给你更多建议。

在COM +端 ,您的对象需要配置为使用(很可能“需要”)分布式事务。 您可以从COM + Explorer中执行此操作,方法是转到对象的“ 属性” ,选择“ 事务”选项卡,然后单击“ 必需 ”。 我不记得你是否可以从代码中做到这一点; VB6是在COM +发布之前创建的,因此它并不完全支持COM +所做的一切(其事务支持是针对COM +的前身,称为MS Transaction Server)。

如果一切正常,您的COM +对象应该参与.NET代码创建的现有Context。

您可以使用“组件服务”中的“分布式事务处理协调器\\事务列表”节点来检查并查看在调用期间创建的分布式事务。

请注意,在提交事务之前,您无法看到来自.NET端的数据查询中反映的COM +组件的更改! 事实上,它有可能陷入僵局! 请记住,DTC将确保两个事务配对,但它们仍然是单独的数据库事务。

===============>>#2 票数:1

你是如何实现的? 如果您使用EnterpriseServices来管理.NET事务,那么两个事务都应该回滚,因为您对它们使用相同的上下文。

  ask by bubbassauro translate from so

未解决问题?本站智能推荐:

1回复

用于.NET的EnterpriseServicesInteropOption到COM +的调用

我需要进行一些数据库更新,其中一部分将通过COM +组件(将为事务启用),而另一些则通过标准LINQ to SQL进行,我希望两个更新都对一个事务的一部分进行。 我打算使用TransactionScope来允许.NET和COM +事务同步。 但是,在阅读了有关EnterpriseServ
1回复

.Net Com + TransactionProxyException的原因以及如何解决?

我有一个使用Com +的.Net 2.0 Windows服务,该服务将xml数据导入到数据库中,并且大多数情况下都可以正常工作。 但是,有时(很少)会引发事务代理异常。 (最近两个月发生一次,在此期间25万次处决是正确的)。 最糟糕的部分是,数据已正确导入数据库,但是会引发异常并且
1回复

不同技术之间的两阶段提交(COM +,Java)

让我先描述一下当前的架构: Application A是一个在JBOSS中运行的java应用程序,它有自己的数据库(mssql)。 应用程序B是在Windows计算机上运行的COM +应用程序,它自己的数据库(mssql)也支持它。 对于某些业务需求,应用程序A必须调用应用程序
2回复

COM + VB6 64位系统上的应用程序:连接到DB2时出现IBM CLI Driver事务错误

我们正在尝试将在VB6中开发的Intranet Web应用程序从Windows Server 2003迁移到Windows Server 2008 R2,并且我们面临着Microsoft SQL Server 2008与Z / OS Mainframe上的DB2之间的两阶段提交事务的问题。
1回复

IIS7运行经典的ASP网站,使用COM +组件进行分布式事务

我们最近在将Web应用程序从Windows Server 2003和IIS6迁移到Windows Server 2008 Standard 32位和IIS7时遇到了一个问题。 该Web应用程序是一个经典的ASP应用程序,它使用许多旧式COM +组件进行某些数据库操作。 数据库服务器是在L
1回复

托管和非托管代码在一个事务中更新数据库?

在C#中,我有一个更新数据库的OracleConnection,以及对C#调用以更新数据库的旧版VB6 DLL的引用(在DLL中,它使用ADODB.Connection对象)。 我需要将它们包装在一个大事务中,以便托管和非托管更新都回滚或提交。 我尝试切换C#类,使其继承System
3回复

在GAC之外的COM +应用程序中注册.NET程序集

我开发了一个.NET程序集(.NET 4.0,强名称),它公开了两个服务组件。 程序集(dll)应该托管在COM +应用程序中,并使用COM +属性(程序集和组件级别)进行修饰。 例如,程序集级别属性: 目前(开发原因),我一直在运行以下脚本来创建COM +应用程序并注册程序集(包含
2回复

从C#应用程序调用本地.NET(2)COM +组件

我已经创建了一个.NET 2 COM +组件,供我们古老的经典ASP网站使用。 这是在经典ASP中非常简单地完成的... 但是,我想使用C#控制台应用程序对组件进行性能分析。 如何在C#控制台应用程序中调用它?
1回复

我可以在SQLServer或Oracle数据库上的C#/。NET中跟踪超时事务吗?

是否可以使用C#/。NET捕获SQLServer或Oracle数据库上的超时事务? 目前,我正在Windows服务上工作,该服务需要监视SQLServer或Oracle中的特定数据表,但是我不知道如何实现这种要求。
2回复

使用LinqToSql保存新事务还是更新事务?

我有一个表,其中包含另一个表中某些项目的点击统计信息。 该表的定义如下 给我一张唱片。 项目公关日。 该数据库在多线程环境中使用,因此两个用户可能会同时进行第一次命中,从而导致创建两个记录,而我只希望hits = 2时为1。 (由于唯一索引,我会得到一个例外) 我如