我不久前做了一些测试,但从未弄清楚如何使其工作。

这些成分:

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

测试:

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

结果:

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

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

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

有帮助吗?

解决方案

由于 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 代码创建的现有上下文中。

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top