我前一段时间做了一些测试,但从来没有弄清楚如何使这项工作成功。
成分:
测试:
运行.Net应用程序并强制执行异常。
结果:
.Net应用程序的更新回滚。
COM +对象所做的更新不会回滚。
如果我从旧的ASP页面调用COM +对象,则回滚可以正常工作。
我知道有些人可能会想“什么?!COM +和.Net你必须忘记!”,但是在这个世界上仍有一些地方仍然有很多COM +组件。如果有人遇到过这种情况并且你想出如何使这项工作,我只是好奇。
答案 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事务,那么两个事务都应该回滚,因为您为它们使用相同的上下文。