简单交易

时间:2010-08-20 05:03:49

标签: linq-to-sql transactions msdtc

我有2个linq 2 SQL语句我想在一个事务中(SQL服务器是远程的,防火墙外等)所有其他通信工作但是当我在TransactionScope()中包装这两个语句时,我开始必须配置我们做过的MSDTC,但是有防火墙问题(我认为)有更简单的方法吗?

我想要做的基础归结为:(两者都是存储过程中的存储过程)

using (var transactionScope = new TransactionScope())
{
    Repository.DataContext.SubmitChanges();
    Repository.DataContext.spDoFinalStuff(tempID, ref finalId);
    transactionScope.Complete();
}

实现这一目标的最简单方法是什么?

修改
首先我得到了这个:事务管理器已禁用其对远程/网络事务的支持。 (HRESULT异常:0x8004D024) 在我们的服务器上,我按照说明here进行了更正。但是这些说明似乎不适用于Windows 7(我的开发框),请参阅我对上述答案的评论。

在更正问题后(在非win7框上)我得到:事务已经被隐式或显式提交或中止(HRESULT异常:0x8004D00E),其中一些谷歌搜索suggested可能是防火墙问题。< / p>

修改
我刚刚发现远程数据库是SQL 2000

4 个答案:

答案 0 :(得分:0)

如果将2个更新发送到2个不同的数据库,.net transactoinScope类需要MSDTC的帮助来协调事务。 SQL Server 2005或更高版本,如果两个更新在同一个数据库中,则不涉及MSDTC。

MSDTC在com +组件服务中配置,选择您的计算机名称,并选择属性,基本上您应该选择无身份验证。

以下链接可能会有所帮助

http://support.microsoft.com/kb/306843

http://blogs.msdn.com/b/distributedservices/archive/2008/11/12/troubleshooting-msdtc-issues-with-the-dtcping-tool.aspx

答案 1 :(得分:0)

您总是可以创建一个新的存储过程,在自己的事务中执行这两个SP吗?快点'脏......

答案 2 :(得分:0)

如果你不想搞乱SQL,那么

TransactionScope就是你要走的路。我不熟悉在防火墙上进行交易并且遇到任何问题。你能发布你遇到的异常/错误吗?

如果它确实导致了您的问题,您可以创建一个存储过程来包装它们并在包装的存储过程中执行事务。

答案 3 :(得分:0)

如果您只需要在事务处理期间处理一个数据库,则只需创建并打开一个新的SqlConnection即可。这可以防止您需要使用TransactionScope。这是一个例子:

using (var con = new SqlConnection("constr"))
{
    con.Open();
    using (var tran = con.BeginTransaction())
    {
        using (var context = new YourDataContext(con))
        {
            // Do stuff
            context.SubmitChanges();
            int generatedId = /* get this id */
            // Do stuff with id

            context.SubmitChanges();
        }
    }
}

因为你使用Repository,你必须在后台创建上下文,但想法是一样的。并且不要忘记处理数据库事务和连接。