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

时间:2008-08-22 01:39:06

标签: .net database transactions com+

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

成分:

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

测试:

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

结果:

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

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

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

2 个答案:

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

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

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

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

答案 1 :(得分:1)

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