所以我有一个WCF服务,在其中有一个Process()方法。该方法从一个表中读取一个字节数组(文件),并将该文件的数据放入多个表中。它只是遍历每一行。在生产环境中,自一个月以来它一直工作得很好。现在突然间,它会偶然抛出以下错误:
可能有帮助的信息:
大约两周前,我们更换了生产Web和DB服务器。只有在我们迁移后才会抛出此错误。当我们使用旧服务器时,我从未遇到过这个问题。但问题是,在前9-10天内没有出现此错误。现在它会突然且不定期地发生。我已经上传了大型文件(1k-2.5k行),它们都能正常工作;而这个错误会在只有200行的小文件中出现!而且有时服务可以完美地处理相同的文件。
代码片段:(它要长得多,但重复类似的操作)
代码片段:(它要长得多,但重复类似的操作)
using (var scope = new TransactionScope())
{
// loop through each row/invoice
foreach (var row in Rows)
{
Invoice invoice = (Invoice)CreateObjectWithConstantData(typeof(Invoice), doc, applicationName);
invoice = (Invoice)FillObjectWithUserData(invoice, row, -1, -1, string.Empty);
invoice.InvoiceNumber = InvoiceDBImpl.SaveInvoice(invoice, processFileRequest.RunId);
if (invoice.InvoiceNumber == Guid.Empty)
{
throw new DataAccessException(string.Format(Messages.ErrorSavingInvoice, invoice.ReceiptId, invoice.ProductID));
}
}
}
其中一个堆栈跟踪:
at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters)
at Tavisca.TramsFileService.DataAccess.TramsDBDataContext.SaveTramsPayment(Nullable`1 paymentDate, String paymentType, Nullable`1 totalAmount, String bankAccount, String paymentMethod, String branch, String remarks, String creditCardLast4, String payeeName, String profileNumber, Nullable`1& paymentId)
at Tavisca.TramsFileService.DataAccess.PaymentDBImpl.<>c__DisplayClass1.<SavePayment>b__0(TramsDBDataContext dc)
at Tavisca.TramsFileService.DataAccess.SystemDataContext.PerformOperation(Action`1 action)
at Tavisca.TramsFileService.DataAccess.PaymentDBImpl.SavePayment(Payment payment)
at Tavisca.TramsFileService.Core.TramsFileController.ProcessFile(ProcessFileRQ processFileRequest)
at Tavisca.TramsFileService.ServiceImplementation.TramsFileServiceImpl.ProcessFile(ProcessFileRQ processFileRequest)
我查看了一些链接:
它们都建议增加 machine.config 中的 TimeOut,但我不确定为什么有时候可以使用,而有时候则不行。这不应该是一致的吗?
WAITFOR DELAY '00:00:40'
并将事务超时设置为 30,命令超时设置为无限制(0)以重现问题。同时,请尝试使用SELECT 1/0
进行复现。 - usr