2

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

我想做的基础知识归结为:(两者都是存储在引擎盖下的过程)

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

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

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

更正问题后(在非 win7 框中)我得到这个:事务已经隐式或显式提交或中止(HRESULT 异常:0x8004D00E),一些谷歌搜索建议可能是防火墙问题。

编辑
我刚刚发现远程数据库是 SQL 2000

4

4 回答 4

0

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

MSDTC在com+组件服务中配置,选择你的计算机名,选择属性,基本上你应该选择No authentication。

以下链接可能会有所帮助

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

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

于 2010-08-20T05:08:03.317 回答
0

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

于 2010-08-20T05:09:04.643 回答
0

TransactionScope如果您不想弄乱 SQL,这是要走的路。我不熟悉通过防火墙进行交易并遇到任何问题。你能发布你遇到的异常/错误吗?

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

于 2010-08-20T05:09:24.057 回答
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();
        }
    }
}

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

于 2010-08-20T06:05:37.120 回答