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

标签 .net database transactions com+

我前段时间做了一些测试,但一直没有想出如何让它工作。

成分:

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

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

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

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

关于.net - 是否可以在 .Net 应用程序和 COM+ 对象之间共享事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21589/

相关文章:

c# - 无法连接到 Oracle 数据库

.NET集合和大对象堆(LOH)

php - AJAX 和禁用的 JavaScript。你担心吗?

java - 在 Hibernate 中比较两个对象的问题

c# - WCF rest 入门工具包和用于 REST 服务的 Web 应用程序工具包之间的区别

c# - 如何在 C# 中覆盖 default(T)?

PHP - 根据另一个页面的回显结果从数据库捕获用户名

python - 使用 django 处理数据库迁移/升级

php - 防止租车重复预订

用于基于事务的事件的 Mongodb