Тайм-аут DataContext.SubmitChanges со странной трассировкой стека - PullRequest
1 голос
/ 13 февраля 2012

Мой большой двухлетний проект был запущен две недели назад.Хотя у нас были нормальные проблемы с запуском, он был довольно успешным, за исключением одной странной ошибки, которая подняла свою голову.

Эта история была изменена;Реальный проект не имеет ничего общего с билетами в кино.

Наш сайт позволяет сотрудникам кинотеатров печатать билеты в кино.После того, как они решили, что они хотят напечатать, они переходят на страницу печати билетов и нажимают «печать».Это отправляет пакет данных на принтер билетов фильмов, и через несколько секунд пользовательский принтер билетов начинает откачивать билеты.

Мы нумеруем билеты и хотим убедиться, что дублирующие номера не используются.Код для выполнения выглядит следующим образом:

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% и более наших рабочих заданий проходят нормально, только эта небольшая доля попадает в эту ошибку, но когда они это делают, несколько из них попадают в нее в течение нескольких минут друг от друга.Я был бы склонен полностью обвинить сервер базы данных, за исключением странной трассировки стека.Любое понимание?

1 Ответ

0 голосов
/ 14 февраля 2012

Это похоже на состояние гонки в тупик, если есть тайм-аут.Что послужило причиной для увеличения некоторого целочисленного значения в качестве уникального идентификатора для заявок вместо простого использования GUID?LINQ-to-SQL действительно предлагает ограниченное ведение журнала, устанавливая свойство DataContext.Log, но я не знаю, насколько это полезно / жизнеспособно в вашем производственном сценарии.

...