【问题标题】:C# - TransactionScope - TransactionAbortedException - The transaction has abortedC# - TransactionScope - TransactionAbortedException - 事务已中止
【发布时间】:2012-01-31 07:52:28
【问题描述】:

我有这样的代码:

class Importer 
{
    private DatabaseContext m_context;

    public: Importer() 
    {
        m_context = new DatabaseContext();
        m_context.CommandTimeout = 5400; //This is seconds
    }

    public bool Import (ref String p_outErrorMsg) 
    {
        List<SomeData> dataToImport = new List<SomeData>();
        getSomeData(ref dataTiImport);

        bool result = false;

        try 
        {
            using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(2, 0, 0))) 
            { //Two hours timeout
                result = importDatas(dataToImport);
                if (result == true) 
                {
                    scope.Complete();
                }
            }
        } 
        catch (TransactionAbortedException ex)
        {
            p_outErrorMsg = String.Format("TransactionAbortedException Message: {0}", ex.Message);
        } 
        catch (ApplicationException ex) 
        {
            p_outErrorMsg = String.Format("ApplicationException Message: {0}", ex.Message);
        }
    }

    bool importDatas(List<SomeData> p_DataToImport) 
    {
        foreach (SomeData data in p_DataToImport) 
        { //There can be somehitg about 3000 iterations
            if (!importSimpleData(data)) 
            {
                return false;
            }
            return true;
        }
    }

    bool importSimpleData(SomeData p_Data) 
    {
        //creation some object o1
        try 
        {
            m_context.objetc1s.InsertOnSubmit(o1);
            m_context.SubmitChanges();
        }
        catch (Exception e) 
        {
            //Error handlig
            return false
        }

        //creation some object o2
        o2.id_o1 = o1.id_o1;
        try 
        {
            m_context.objetc2s.InsertOnSubmit(o2);
            m_context.SubmitChanges();
        } 
        catch (Exception e) 
        {
            //Error handlig
            return false
        }

        //creation some object o3
        o3.id_o2 = o2.id_o2;
        try 
        {
            m_context.objetc3s.InsertOnSubmit(o3);
            m_context.SubmitChanges();
        } 
        catch (Exception e) 
        {
            //Error handlig
            return false
        }

        //creation some object o4
        o4.id_o1 = o1.id_o1;
        try 
        {
            m_context.objetc4s.InsertOnSubmit(o4);
            m_context.SubmitChanges();
        } 
        catch (Exception e) 
        {
            //Error handlig
            return false
        }

        return true;
    }
}

如果 List 有 500 条记录,则一切正常。 但是当列表接近 1000 时,我总是例外: TransactionAbortedException.Message = "事务已中止"。

首先我认为超时时间很小,所以我确实介绍了这两行代码: ... m_context.CommandTimeout = 5400; //这是秒(1.5小时) ... using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(2, 0, 0))) { //两小时超时 ...

正如您在上面的代码中看到的那样。

同样的异常仍然发生,我错过了什么吗? 我做错了什么? 我必须补充说数据库是远程的(不是本地的)

提前感谢您的帮助!

【问题讨论】:

  • 不是只显示异常消息,你能对它做一个完整的 ToString() 吗?然后我们会看到更多信息。
  • 目前尚不清楚为什么您拥有外部事务范围 - 如果其中任何一个失败,似乎可以将其全部回滚,但如果这是您想要的,只需提交它们全部作为单一交易?此外,如果您正在批量加载,您可能希望使用 SqlBulkCopy - msdn.microsoft.com/en-us/library/…

标签: c# transactionscope


【解决方案1】:

我不得不再次挖掘文档,但将事务超时设置为 2 小时可能不会发生。通过 machine.config 设置事务超时时间的上限,如果您指定的时间超过该上限,它会悄悄地忽略您。

我很久以前就遇到过这个问题,并找到了一种基于反射的方法来调整该设置 here by Matt Honeycutt 以确保您确实获得了您指定的超时时间。

【讨论】:

  • 第 2 段中的“这里”是否应该是一个超链接——目前不是?编辑:自己找到并添加了链接。
【解决方案2】:

似乎 importSimpleData 在某些行上失败并且 importData 返回 false。在这种情况下,您不调用scope.Complete(),这就是事务回滚的原因。

【讨论】:

  • 是的,但这会引发 TransactionAbortedException 吗?
  • 不幸的是每一个插入: context.InsertInSubmit(...); context.SubmittChanges() 成功了。
  • @henginy 你是对的。有什么帮助是知道在哪里引发了异常。如果是在 importDatas 执行期间或在 scope.Complete 调用期间。
  • 在 TransactionScope 范围结束期间引发异常。
  • @Roman 参见TransactionScope.Dispose 方法。
猜你喜欢
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2014-02-14
  • 2020-04-24
  • 2013-10-19
相关资源
最近更新 更多