4

不久前我做了一些测试,但从未弄清楚如何进行这项工作。

这些成分:

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

测试:

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

结果:

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

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

我知道有些人可能在想“什么?!COM+ 和 .Net,你一定是疯了!”,但世界上有些地方仍然有很多 COM+ 组件。我只是好奇是否有人遇到过这个问题,以及你是否知道如何使这项工作。

4

2 回答 2

2

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

EnterpriseServices从 .NET管理 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 中执行此操作,方法是转到对象的Properties,选择Transaction选项卡,然后单击“ Required ”。我不记得你是否也可以从代码中做到这一点;VB6 是在 COM+ 发布之前创建的,因此它并不完全支持 COM+ 所做的一切(它的事务支持是针对 COM+ 的前身,称为 MS 事务服务器)。

如果一切正常,您的 COM+ 对象应该在您的 .NET 代码创建的现有上下文中登记。

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

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

于 2008-09-15T20:17:25.580 回答
1

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

于 2008-08-22T01:42:23.133 回答