【问题标题】:Simple Transactions简单交易
【发布时间】:2010-08-20 05:03:49
【问题描述】:

我有 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) 在我们的服务器上,我按照here 的说明进行了更正。但是,这些说明似乎不适用于 Windows 7(我的开发箱),请参阅我对上述答案的评论。

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

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

【问题讨论】:

    标签: linq-to-sql transactions msdtc


    【解决方案1】:

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

    在com+组件服务中配置MSDTC,选择你的计算机名,选择属性,基本上你应该选择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

    【讨论】:

    • 啊,我刚刚发现远程服务器正在使用 SQL 2000
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      当您在事务期间只需要处理一个单一的数据库时,您可以简单地创建并打开一个新的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,您将不得不在背景上创建上下文,但想法是一样的。并且不要忘记处理数据库事务和连接。

      【讨论】:

        【解决方案4】:

        TransactionScope 是您不想弄乱 SQL 的最佳选择。我不熟悉通过防火墙进行交易并遇到任何问题。您能发布您遇到的异常/错误吗?

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

        【讨论】:

          猜你喜欢
          • 2018-01-26
          • 1970-01-01
          • 2021-03-11
          • 1970-01-01
          • 2018-08-02
          • 2017-05-23
          • 1970-01-01
          • 2013-10-28
          • 1970-01-01
          相关资源
          最近更新 更多