TransactionScope,linq和奇怪的事务管理器问题(HRESULT:0x8004D024)

时间:2009-04-07 19:00:55

标签: linq linq-to-sql transactionscope

我有一个服务级别方法,它对数据库进行了一些更改,我希望它们使用事务控制。这样的方法可以做到: - LINQ SubmitChanges()功能 - 调用StoredProcedures

组件用户可以将这些基本操作集合组合成更大的东西。

我看到有很好的TransactinScope类并尝试使用它:

using (TransactionScope transaction = new TransactionScope())
{
     content = repository.CreateBaseContent(content);
     result = repository.CreateTreeRelation(content, parent.Id, name);
     transaction.Complete();
}

public baseContent CreateBaseContent(baseContent content)
{
       EntityContext.baseContents.InsertOnSubmit(content);
       EntityContext.SubmitChanges();

       return content;
}

public CreateTreeRelation (params)
{
// do StoredProcedure call here via LINQ
}

我的假设是在外层上可以添加另一级别的事务范围。相反,我有以下错误:

事务管理器已禁用其对远程/网络事务的支持。 (HRESULT异常:0x8004D024)

我正在为MS SQL 2005和微软开发服务器使用相同的(Vista Ultimate)机器。从单元测试一切正常。在TransactionScope评论时也是如此。

我尝试使用DTC(http://support.microsoft.com/kb/899191)的安全性,当我设置为接受所有入站和出站事务时,我有以下错误消息:

错误HRESULT E_FAIL已从调用COM组件返回。

在调试期间,我发现在SubmitChanges中,Linq实体上下文具有属性事务IS NULL(!!),而System.Transactions.Transaction.Current具有打开事务

2 个答案:

答案 0 :(得分:3)

我认为你也可以使用TransactionScope,只要你传递datacontexts同一个连接你。打开。

您使用TransactionScope时遇到的另一个问题是它不关心连接字符串是否相同,只需要做一秒.Open会将事务提升为分布式事务。然后你必须处理相关的配置,以及它没有使用那种情况所需的轻量级事务。

答案 1 :(得分:2)

问题发生是因为在transactioncope之前创建了Linq Datacontext。

解决方案是将自己的事务控制添加到LINQ datacontext。

Connection.Open()
Transaction = Connection.BeginTransaction();

和计数器来维护嵌套调用。