我有一个多线程应用程序,需要从同一位置的同一表中插入大量记录。连续运行2小时后,我的应用程序遇到了连接超时问题。
堆栈跟踪
System.Data.SqlClient.SqlException(0x80131904):超时已过期。 在操作完成之前超时 服务器没有响应。
System.ComponentModel.Win32Exception(258):等待操作超时
在System.Data.SqlClient.SqlConnection.OnError(SqlException异常, 布尔值breakConnection,动作为1 wrapCloseInAction),位于 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔值调用者HasConnectionLock,布尔值asyncClose) System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler,SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady) System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()在 System.Data.SqlClient.SqlDataReader.get_MetaData()
我怀疑这可能是特定表中死锁的原因。我在SQL Server中验证了该表处于死锁状态。
我尝试了以下解决方案
using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
SERIALIZABLE
和SNAPSHOT隔离级别运行多线程应用程序时,它显示“ MSDTC Server on unavailable”。
注意:我启动了分布式事务处理协调器服务,但仍然让您的环境不支持分布式事务处理
我尝试使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
,但连续运行2小时后仍然遇到相同的问题
我在C#代码的SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
和BeginTransaction
之间添加了Commit transaction
,但是没有运气。
请问有人可以帮助我克服这个困难吗?
此外,我想这可能是导致我们的应用程序与SQL Server数据库之间打开多个连接的原因。仅供参考。我仅在using语句中添加了查询,但连接仍未关闭。我怎么说这意味着来自SQL Server的sysprocess的连接数量显示了许多打开的连接