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

这些成分:

  • 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

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