首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架异常: SqlConnection不支持并行事务

问实体框架异常: SqlConnection不支持并行事务
EN

Stack Overflow用户
提问于 2019-07-18 06:44:40
回答 1查看 1.3K关注 0票数 1

我们有一个处理XML文件的应用程序。应用程序使用EF 6将数据保存到DB。应用程序使用ThreadPool.QueueUserWorkItem方法处理并发线程中的文件。申请期为1,5年,效果良好。现在我们开始获得EF异常,如下所示:

大多数情况下,没有这样的错误,但它是一天几次。我们成功地找出了导致EF产生此错误的原因或条件。

有什么建议吗?

代码语言:javascript
复制
 An error occurred while starting a transaction on the provider connection. See the inner exception for details.
   at System.Data.Entity.Core.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevel isolationLevel)
   at System.Data.Entity.Core.EntityClient.EntityConnection.BeginTransaction()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
   at System.Data.Entity.Infrastructure.DbExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at Albatross.Core.Utilities.BasicDataRepository`2.Update(T entity) in c:\DevTFS\AlbatrossEmployers\AlbatrossEmployers_DevTiyuvHeshb\Albatross.Core\Utilities\BasicDataRepository.cs:line 177
****** Inner Exception - START ******
SqlConnection does not support parallel transactions.
   at System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName, Boolean shouldReconnect)
   at System.Data.SqlClient.SqlConnection.BeginTransaction(IsolationLevel iso, String transactionName)
   at System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel isolationLevel)
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.BeginTransaction(DbConnection connection, BeginTransactionInterceptionContext interceptionContext)
   at System.Data.Entity.Infrastructure.DbExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevel isolationLevel)
****** Inner Exception - END ******
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Error - END ~~~~~~~~~~~~~~~~~~~~~~~~~~


The code is pretty simple:

     public virtual T Add(T entity)
        {
            try
            {
                using (U entityContext = new U())
                {
                    T addedEntity = Add(entity, entityContext);
                    entityContext.SaveChanges();
                    return addedEntity;
                }
            }
            catch (DbEntityValidationException e)
            {
                var msg = FormatDbValidationErrors(e);
                throw new Exception(msg);
            }
            catch (Exception ex)
            {
                AmanLog.Logger.Error(ex);
                throw;
            }
        }


 public virtual T Update(T entity)
        {
            try
            {
                using (U entityContext = new U())
                {
                    T existingEntity = Update(entity, entityContext);
                    entityContext.SaveChanges();
                    return existingEntity;
                }
            }
            catch (DbEntityValidationException e)
            {
                var msg = FormatDbValidationErrors(e);
                throw new Exception(msg);
            }
            catch (Exception ex)
            {
                AmanLog.Logger.Error(ex);
                throw;
            }
        }
EN

回答 1

Stack Overflow用户

发布于 2019-07-18 07:02:53

应用程序使用ThreadPool.QueueUserWorkItem方法处理并发线程中的文件。

不能从两个线程并发使用相同的连接,否则:会发生这种情况。以下任一项:

  • 通过单个连接/DB上下文进行同步,使其不能同时使用两次(lock将是实现这一目标的简单方法)
  • 使用每个工作项连接/DB上下文,这样就不会共享任何内容。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57088506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档