Webservice Deadlock Problem

25. März 2013 19:14

Hallo,
ich befülle über ein Webservice ein Artikelbuchblatt (Abbuchung).
Wobei bis zu vier Zeilen in das Buchblatt geschrieben werden. Jedoch immer eine Zeile nach dem anderen. Sprich in der C#-Applikation wird eine NAV-Codeunit bis zu viermal (über eine Schleife) aufgerufen.
Da es sich um chargenpflichtige Artikeln handelt und fast niemals die gesamte Menge der Charge abgebucht werden soll, wird auch noch die jeweilige Artikelverfolgungszeile angepasst.
Anbei ein Ausschnitt aus der C#-Applikation.
Code:
artikelbuchblatt.Posting_Date = DateTime.Today;
                artikelbuchblatt.Chargen_Nr_Eingabe = Chargennr;
                artikelbuchblatt.Line_No = Zeilennr;      //Diese wird von Navision nicht vergeben! Besser dokumentieren.
                artikelbuchblatt.Line_NoSpecified = true;
                if (GesamtMenge == false)
                {
                    artikelbuchblatt.Quantity = Abbuchungsmenge;
                    artikelbuchblatt.QuantitySpecified = true;
                }
                artikelbuchserv.Create(NAVJnlBatchNameAB, ref artikelbuchblatt);

                //Artikelverfolgungszeile Menge ändern wenn nicht die gesamte Menge abzubuchen ist.             
                if (GesamtMenge == false)
                {
                    wsbde.ArtikelLinienAbVerfolgChange(Chargennr, Abbuchungsmenge);
                }
                //Buchung durchführen                                               
                if (Buchen)
                {
                    wsbde.ArtikelLinienAbbuchung("ARTIKEL", NAVJnlBatchNameAB);
                    MessageBox.Show("Charge(n) wurden abgebucht!", "BUCHUNG", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LogInfo("Charge(n) wurden bei Abbuchung abgebucht!");  //Jede Abbuchung mitschreiben                       
                }


Meist funktioniert dies auch alles ohne ein Problem.
Nur machmal bekomme ich den Fehler
"Your activity was deadlocked with another user who was modifying the Reservation Entry table. Start again."
und dann habe ich das Problem, das z.B.für eine Zeile falsche Werte in der Artikelverfolgungszeile sind.

Wie könnte ich das lösen, das im Fehlerfall alles wieder zurückgenommen wird. Sprich so eine Art Rollback.

lg
stony

Re: Webservice Deadlock Problem

26. März 2013 10:24

Code:
try
{
Zeilenerstellung
}
catch
{
Löschung Buchblattzeilen bei Problem
}

Re: Webservice Deadlock Problem

26. März 2013 11:48

Kannst Du feststellen wer da Änderungen vornimmt oder ob Du das selber bist?

Im Prinzip hatte ich ein ähnliches Szenario beim Anlegen von Aufträgen. Da kam öfter die Meldung, dass eine anderer User was geändert hat. Der andere User war ich aber selber. Umgangen habe ich das indem ich nach dem Anlegen ein Update gemacht haben und dann den Datensatz neu eingelesen und geändert habe. Seitdem keine Fehler mehr.

Volker

Re: Webservice Deadlock Problem

26. März 2013 16:47

Wie kann ich feststellen, wer die Änderung vornimmt.
Das mit try habe ich zwar eingebaut, aber leider vergessen das catch unter der entsprechenden Methode so zu gestalten, das der Fehler auch in die aufrufenden Methode zurückgemeldet wird.

Re: Webservice Deadlock Problem

29. März 2013 14:42

Hier wird beschrieben, wie man Blocks & Deadlocks auf die Schliche kommt: http://dynamicsuser.net/blogs/stryk/archive/tags/Locking/default.aspx