视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
数据频繁update,导致sqlserver数据库整体锁死,客户端都无法访
2020-11-09 15:34:57 责编:小采
文档


介绍:文件上传功能,使用wcf提供 服务 , 数据 库使用EntityFramework4 访问 。 问题现象:在wcf有一个文件块上传方法 /// summary /// 上传文件 /// /summary /// param name="block" 文件块信息 /param /// returns 上传文件的信息状态 /returns public o

介绍:文件上传功能,使用wcf提供服务,数据库使用EntityFramework4访问。

问题现象:在wcf有一个文件块上传方法

///


/// 上传文件
///

///文件块信息
///上传文件的信息状态
publicoverride FileTransportAck UpLoadFile(FileBlock block)
{
lock (lockobj)
{
//查找文件是否存在
tab_FileInfo theFileInfo = m_NetBidEnt.tab_FileInfo
.Where(o => o.FileID.Equals(block.FileID))
.FirstOrDefault();

if (theFileInfo ==null)
thrownew Exception("文件未初始化,上传失败");

//返回传输结果
FileTransportAck result =new FileTransportAck();
//写入文件块
if (FileSysIO.WriteBlock(theFileInfo, block))
{
theFileInfo.UploadedSize += block.Size;
theFileInfo.FileSize = block.Total;
theFileInfo.UpdateDate = DateTime.Now;
m_NetBidEnt.SaveChanges();
}
else
thrownew Exception("写入文件块失败");
//写入返回值
result.FileId = theFileInfo.FileID;
result.Offset = (long)theFileInfo.UploadedSize;
if (theFileInfo.UploadedSize >= block.Total)
result.TransportStat = FileTransportStat.Finished;
else
result.TransportStat = FileTransportStat.ResumeBreakPoint;
return result;
}
}

此方法会在上传文件时循环调用,基本是每10K传一次,即会调用此访问一次,但很奇怪的问题是如果文件在10M以上时,传输过程中会出现停止。此时查看数据库服务整体就像是锁死了一样,使用ssms也无法连接,报出的异常都是连接超时。

后来在wcf的方法内增加了日志用于记录异常,记录的异常如下:

Exception Message
2011-07-2800:38:26,451 An error occurred while starting a transaction on the provider connection. See the inner exception for details.
StackTrace
2011-07-2800:38:26,467 at System.Data.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevel isolationLevel)
at System.Data.EntityClient.EntityConnection.BeginTransaction()
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Objects.ObjectContext.SaveChanges()
at NetBid.FileServices.Impl.FileSysFileService.UpLoadFile(FileBlock block)
at NetBid.FileServices.Wcf.FileServiceWCF.UploadFileBlock(FileBlock block, Dictionary`2 parameters)
Inner Exception:
2011-07-2800:38:26,467 Inner Exception:System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
at System.Data.SqlClient.TdsParserStateObject.ReadByte()
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.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName)
at System.Data.SqlClient.SqlInternalConnection.BeginTransaction(IsolationLevel iso)
at System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel isolationLevel)
at System.Data.Common.DbConnection.BeginTransaction(IsolationLevel isolationLevel)
at System.Data.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevel isolationLevel)
2011-07-2800:38:26,467=======================================================分割线

异常看上去像是事务问题,但有一个奇怪的现象是:上传过程中一旦出现停止现象后,整个数据库都无法访问,只能将数据库的服务停止并重新启动。

下载本文
显示全文
专题