ABC*_*EFG 5 c# sql-server multithreading entity-framework sql-server-2012
我们有一个C#多线程(100个线程)程序,该程序从DB中读取记录,每个线程选择一个记录(每个线程一个Entity Framework连接)并更新单个DB表。
在最初的几分钟(5分钟)中,程序毫无例外地正常运行,然后所有线程突然开始抛出以下错误消息。.〜1分钟后,所有内容将恢复正常状态。.我认为SQL Server也变得越来越单个数据库表有很多锁(可能试图获取该表上的表锁),或者单个数据库有太多连接并关闭所有连接。
我无法调试此消息,有人可以帮助我获取以下信息,
SQL Server 2012将日志存储在哪里?
我们能否增加日志级别以查看为什么在保存数据库实体时引发异常
如何获取每个表的锁数,数据库获取的不同类型的锁(表锁,页锁,num行锁等)
任何其他调试此问题的指针。
仅供参考,我没有发现从此cmd(SELECT SERVERPROPERTY('ErrorLogFileName'))获取的sqlerror日志中有用的任何东西
这是异常的堆栈跟踪
System.Data.Entity.Infrastructure.CommitFailedException:提交数据库事务时报告了错误,但无法确定事务在数据库服务器上是成功还是失败。有关更多信息,请参阅内部异常和http://go.microsoft.com/fwlink/?LinkId=313468。
System.Data.SqlClient.SqlException:超时已过期。在操作完成之前超时或服务器没有响应。
System.ComponentModel.Win32Exception:等待操作超时
在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔型breakConnection,操作1.Dispatch [TTarget,TInterceptionContext](TTarget目标,执行Action 3,执行Action`3) -内部异常堆栈跟踪的结尾- --
1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalTransaction.Commit()
at System.Data.SqlClient.SqlTransaction.Commit()
at System.Data.Entity.Infrastructure.Interception.DbTransactionDispatcher.<Commit>b__c(DbTransaction t, DbTransactionInterceptionContext c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher2 operation, TInterceptionContext interceptionContext, Action在System.Data.Entity.Infrastructure.Interception.InternalDispatcher
1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action2操作,TInterceptionContext拦截上下文, 在System.Data.Entity.Infrastructure.Interception.DbTransactionDispatcher.Commit(DbTransaction事务,DbInterceptionContext拦截上下文) 在System.Data.Entity 处3 executing, Action执行操作3 。 System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction [T](系统1的Func 1操作) 处的Core.EntityClient.EntityTransaction.Commit() System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(ExecuteOptions选项)处的executeInExistingTransaction )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.Core.Objects.ObjectContext.<>c__DisplayClass2a.<SaveChangesInternal>b__27()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func
在System.Data.Entity.Internal.InternalContext.SaveChanges()
在System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
在System.Data.Entity.DbContext.SaveChanges()
小智 0
我曾经遇到过同样的问题。如果线程应用程序对所有线程使用相同的上下文对象,我们就会面临此类问题。为每个线程创建单独的上下文对象。您可能会在 RAM 上添加更多负载,但它可以清晰地显示上下文中实体的状态。
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());
Run Code Online (Sandbox Code Playgroud)