Мой большой двухлетний проект был запущен две недели назад.Хотя у нас были нормальные проблемы с запуском, он был довольно успешным, за исключением одной странной ошибки, которая подняла свою голову.
Эта история была изменена;Реальный проект не имеет ничего общего с билетами в кино.
Наш сайт позволяет сотрудникам кинотеатров печатать билеты в кино.После того, как они решили, что они хотят напечатать, они переходят на страницу печати билетов и нажимают «печать».Это отправляет пакет данных на принтер билетов фильмов, и через несколько секунд пользовательский принтер билетов начинает откачивать билеты.
Мы нумеруем билеты и хотим убедиться, что дублирующие номера не используются.Код для выполнения выглядит следующим образом:
using (TicketContext context = new TicketContext(ConnectionString)) {
// call a stored proc that allocates a group of tickets with fancy transaction stuff
var result = context.GetNextTicketGroup(tickets.Count).FirstOrDefault();
if (result == null || !result.Column1.HasValue || result.Column1.Value == -1)
return "There was an error allocating ticket numbers";
int ticketNumber = result.Column1.Value;
// Put the ticket numbers in the ticket objects
int i;
for (i = 0; i < ticketCount; i++) {
tickets[i].TicketNumber = ticketNumber + i;
}
for (i = 0; i < ticketCount; i++) {
// Convert the ticket object that we've been working with into
// a record that is the kind we have in the database and
// put that into the database. CreateTicket() doesn't do any
// database stuff directly.
DBTicket newticket = CreateTicket(ticket[i]);
context.Tickets.InsertOnSubmit(newticket);
}
// Each ticket is tied to an Issuance ID - Get a list of IssuanceIDs from the
// list of tickets and mark them as printed
var IDs = items.Select(id => id.IssuanceID).Distinct();
foreach (Guid g in IDs) {
var Issuance = context.TicketIssuances.Where(ti => ti.ID == g).FirstOrDefault();
if(Issuance != null) {
Issuance.Printed = true;
}
}
// Submit the changes to the database
context.SubmitChanges();
// Send the printers to the ticket printer via a web service
using (TicketService.TicketSoapClient ssc = new TicketService.TicketSoapClient()) {
var a = tickets.ToArray();
if (ssc.PrintTickets(a) == false)
return "Error printing.";
}
} // LINE 392
Необычная часть заключается в том, что время ожидания context.SubmitChanges()
истекло, но трассировка стека выглядит так:
[...]
at System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject item)
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at Portal.Tickets.PrintTickets.PrintTicketList(List`1 items) in d:\Source\PrintTickets.aspx.cs:line 392
at Portal.Tickets.PrintTickets.btnPrintTickets_Click(Object sender, EventArgs e) in d:\Source\PrintTickets.aspx.cs:line 236
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Я позвонилвне строки 392 в коде выше;обратите внимание, что именно в тот момент, когда текстовый текст выходит за пределы области видимости, намного позже того времени, которое должно было произойти.
Это небольшие работы, которые, безусловно, не прекратят свое существование без какого-либо тупика или чего-то подобного;мы помещаем только десятки записей в базу данных одновременно, и сервер не перегружен.99% и более наших рабочих заданий проходят нормально, только эта небольшая доля попадает в эту ошибку, но когда они это делают, несколько из них попадают в нее в течение нескольких минут друг от друга.Я был бы склонен полностью обвинить сервер базы данных, за исключением странной трассировки стека.Любое понимание?