代码之家  ›  专栏  ›  技术社区  ›  bubbassauro

是否可以在.NET应用程序和COM+对象之间共享事务?

  •  4
  • bubbassauro  · 技术社区  · 17 年前

    我前一段时间做了一些测试,但一直没弄明白怎么做。

    成分:

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

    测试:

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

    结果:

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

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

    我知道有些人可能在想“什么?!com+和.net,你一定疯了!”但是在这个世界上有些地方仍然有很多COM+组件。我只是好奇是否有人曾经面对过这个问题,以及你是否知道如何使这个问题得以解决。

    2 回复  |  直到 12 年前
        1
  •  2
  •   Euro Micelli    17 年前

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

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

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

    我对这方面还不够熟悉,不能给你更多的建议。

    在COM+端 ,需要将对象配置为使用分布式事务(很可能是“需要”)。您可以从COM+资源管理器转到对象的 性质 选择 交易 选项卡,然后单击“ 要求的 “。我不记得您是否也可以从代码中做到这一点;vb6是在COM+发布之前创建的,因此它并不完全支持COM+所做的一切(它的事务支持是针对COM+的前身,称为MS Transaction Server)。

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

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

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

        2
  •  1
  •   Eric Z Beard    17 年前

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