System.Data.Entity.Infrastructure.CommitFailedException:C#多线程&;SQL Server 2012
我们有一个C#多线程(100个线程)程序,它从数据库中读取记录,每个线程拾取一条记录(每个线程一个实体框架连接)并更新单个数据库表 在最初几分钟(5分钟)内,程序正常运行,没有异常,然后突然所有线程开始抛出以下错误消息。。约1分钟后,一切都将恢复正常。。我认为SQL Server为单个DB表获取了太多锁(可能试图获取该表上的表锁),或者为单个DB获取了太多连接并关闭了所有连接 我无法调试这个,有人能帮我得到以下信息吗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在哪里存储其日志 我们是否可以增加日志级别,以了
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,Action2操作,TInterceptionContext拦截Context,Action
3执行,Action`3执行)---内部异常堆栈跟踪的结束--- 在System.Data.Entity.Infrastructure.InternalDispatcher
1.Dispatch[TTarget,TInterceptionContext](TTarget,Action
2 operation,TInterceptionContext,Action3 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());