System.Data.Entity.Infrastructure.CommitFailedException:C#多线程&;SQL Server 2012

System.Data.Entity.Infrastructure.CommitFailedException:C#多线程&;SQL Server 2012,c#,sql-server,multithreading,entity-framework,sql-server-2012,C#,Sql Server,Multithreading,Entity Framework,Sql Server 2012,我们有一个C#多线程(100个线程)程序,它从数据库中读取记录,每个线程拾取一条记录(每个线程一个实体框架连接)并更新单个数据库表 在最初几分钟(5分钟)内,程序正常运行,没有异常,然后突然所有线程开始抛出以下错误消息。。约1分钟后,一切都将恢复正常。。我认为SQL Server为单个DB表获取了太多锁(可能试图获取该表上的表锁),或者为单个DB获取了太多连接并关闭了所有连接 我无法调试这个,有人能帮我得到以下信息吗 SQL Server 2012在哪里存储其日志 我们是否可以增加日志级别,以了

我们有一个C#多线程(100个线程)程序,它从数据库中读取记录,每个线程拾取一条记录(每个线程一个实体框架连接)并更新单个数据库表

在最初几分钟(5分钟)内,程序正常运行,没有异常,然后突然所有线程开始抛出以下错误消息。。约1分钟后,一切都将恢复正常。。我认为SQL Server为单个DB表获取了太多锁(可能试图获取该表上的表锁),或者为单个DB获取了太多连接并关闭了所有连接

我无法调试这个,有人能帮我得到以下信息吗

  • SQL Server 2012在哪里存储其日志

  • 我们是否可以增加日志级别,以了解它在保存DB实体时引发异常的原因

  • 如何获取每个表的锁数,DB获取的不同类型的锁(表锁、页锁、num行锁等)

  • 调试此问题的任何其他指针

  • 仅供参考,我在从该cmd获取的sqlerror日志中没有发现任何有用的内容(选择SERVERPROPERTY('ErrorLogFileName'))

    下面是异常的堆栈跟踪

    System.Data.Entity.Infrastructure.CommitFailedException:提交数据库事务时报告错误,但无法确定该事务在数据库服务器上是否成功。有关更多信息,请参阅内部异常和

    System.Data.SqlClient.SqlException:超时已过期。操作完成前已过超时时间,或者服务器没有响应

    System.ComponentModel.Win32异常:等待操作超时

    在System.Data.SqlClient.SqlInternalConnection.OneError(SqlException异常,布尔断开连接,操作
    1 wrapCloseInAction)
    位于System.Data.SqlClient.TdsParser.ThroweException和Warning(TdsParserStateObject StateObjectObj,布尔调用连接锁,布尔异步关闭)
    在System.Data.SqlClient.TdsParserStateObject.ReadsInError处(TdsParserStateObject stateObj,UInt32错误)
    位于System.Data.SqlClient.TdsParserStateObject.ReadsInSyncOverAsync()
    位于System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
    位于System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
    位于System.Data.SqlClient.TdsParserStateObject.TryReadByte(字节和值)
    在System.Data.SqlClient.TdsParser.TryRun(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady)
    在System.Data.SqlClient.TdsParser.Run(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)
    在System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(字节[]缓冲区,TransactionManagerRequestType请求,字符串transactionName,TransactionManagerSolationLevel isoLevel,Int32超时,SqlInternalTransaction事务,TdsParserStateObject stateObj,布尔值IsDeleteControlRequest)
    在System.Data.SqlClient.SqlInternalConnectionDS.ExecuteTransactionYukon(TransactionRequest TransactionRequest、String transactionName、IsolationLevel iso、SqlInternalTransaction internalTransaction、Boolean IsDeleteGateControlRequest)
    在System.Data.SqlClient.SqlInternalConnectionDS.ExecuteTransaction(TransactionRequest TransactionRequest,字符串名称,IsolationLevel iso,SqlInternalTransaction internalTransaction,Boolean IsDeleteGateControlRequest)
    位于System.Data.SqlClient.SqlInternalTransaction.Commit()
    在System.Data.SqlClient.SqlTransaction.Commit()上 在System.Data.Entity.Infrastructure.Interception.DbTransactionDispatcher.b_uuC(DbTransaction t,DbTransactionInterceptionContext c)
    在System.Data.Entity.Infrastructure.InternalDispatcher.Dispatcher中
    1.分派[TTarget,TInterceptionContext](TTarget,Action
    2操作,TInterceptionContext拦截Context,Action
    3执行,Action`3执行)
    ---内部异常堆栈跟踪的结束---

    在System.Data.Entity.Infrastructure.InternalDispatcher
    1.Dispatch[TTarget,TInterceptionContext](TTarget,Action
    2 operation,TInterceptionContext,Action
    3 executing,Action
    3 executed)
    位于System.Data.Entity.Infrastructure.Interception.DbTransactionDispatcher.Commit(DbTransaction事务,DbInterceptionContext interceptionContext)
    位于System.Data.Entity.Core.EntityClient.EntityTransaction.Commit()
    在System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func
    1 Func,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess)
    位于System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(保存选项选项、IDBEcutionStrategy执行策略、布尔startLocalTransaction)
    在System.Data.Entity.Core.Objects.ObjectContext.c__DisplayClass2a.b__27()
    在System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func
    1操作)
    位于System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions选项,布尔执行现有事务)
    位于System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions)
    位于System.Data.Entity.Internal.InternalContext.SaveChanges()
    位于System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
    位于System.Data.Entity.DbContext.SaveChanges()处


    如果线程应用程序对所有线程使用相同的上下文对象,我们将面临此类问题。 为每个线程创建单独的上下文对象。您可能会在线程上添加更多负载
    List<Task> tasks = new List<Task>();
    foreach (var item in list)
    {
       ObjectContext oContext = new ObjectContext("MyConnection");
       Task t = Task.Factory.StartNew(() =>
       {
          this.Update(item,oContext);
       });
       tasks.Add(t);
    }
    
    Task.WaitAll(tasks.ToArray());