2011-01-07 6 views
0

Ich stoße auf ein Problem mit dem Code, an dem ich gerade arbeite. Die Aufgabe besteht darin, eine Datei mit Bestelldetails zu erhalten. Die Bestellung hat einzelne Artikel und jeder Artikel hat seinen Lieferplan. Die Erzeugung von PO ist atomar (alles oder nichts). All dies läuft unter einer Transaktion.Zugriff auf nicht übergebene Hauptdaten im Worker-Thread

Ich habe bereits folgende Methoden für die Unteraufgaben. 1. CreatePO 2. CreateItem 3. AddDeliveryScheduleToItem (ItemId).

Wenn ich all dies in sequenzieller Weise ausführen, funktioniert alles gut. Sequenzielle Mode bedeutet, dass ich zuerst PO erstelle. Zweitens erstelle ich alle Artikel einzeln unter PO. Drittens: Ich füge einen Lieferplan zu jeder Werbebuchung einzeln hinzu. Hier beginnt die Transaktion vor dem Anlegen der Bestellung und dem Commit, nachdem der Lieferplan allen Positionen hinzugefügt wurde. Wenn ein Fehler auftritt, setzt die App die Transaktion zurück.

Beim Hinzufügen des Lieferplans zu Artikel lade ich den Artikeldatensatz aus der Datenbank ab, um die Zeitplandetails abzurufen, so wie der aktuelle Code geschrieben wird.

So weit so gut.

Das Hinzufügen von Lieferplan ist zeitraubend, daher haben wir uns entschieden, Threading hinzuzufügen und den hinzuzufügenden Lieferplan parallel auszuführen. Also habe ich eine Methode namens AddDeliveryScheduleInThread() erstellt und innerhalb dieser Methode AddDeliveryScheduleToItem (ItemId) aufgerufen.

Mit ThreadPool feuere ich AddDeliveryScheduleInThread() parallel. Jetzt tritt ein Problem auf, wenn AddDeliveryScheduleToItem (ItemId) versucht, den Item-Datensatz basierend auf der Item-ID abzurufen. Denken Sie daran, dass wir diesen Artikel im Hauptthread der Transaktion erstellt haben, aber noch nicht festgelegt wurde.

Der Code derzeit Spring.NET-Transaktion und ich kann nicht viel Hilfe dort drüben finden.

Wie wird das Problem gelöst? Bitte hilf mir.

Ich bin offen für die Verwendung der Spring.NET-Transaktion. Ich schaue gerade in die zuverlässige Transaktion und die verbindbare Transaktion, wenn das helfen kann.

Dank

+0

"Das Hinzufügen von Lieferplan ist zeitraubende Aufgabe" - könnten Sie das erklären? –

+0

Es gibt etwas Kakulkation und andere Dinge als nur einfach einfügen. So ist es unser erster Kandidat, um die gesamte Transaktion parallel zu bearbeiten. Das Hauptproblem liegt im Multithread-Modus. Das im Haupt-Thread erstellte Element ist im Worker-Thread nicht verfügbar und fügt den Zeitplan dem Element hinzu. – Henry

+0

Warum nicht einfach das ganze Lied laufen lassen und auf einem Thread tanzen? –

Antwort

0

AddDeliveryScheduleToItem (ItemId) die Item-Rekord auf Artikel-ID basiert abzurufen versucht. Denken Sie daran, wir haben dieses Element im Haupt-Thread in Transaktion erstellt, aber es ist noch nicht commited .

Ich kann nur an zwei Optionen denken.

1) Fügen Sie AddDeliveryScheduleToItem (ItemId) erst hinzu, wenn die Transaktion festgeschrieben wurde.

2) Fügen Sie AddDeliveryScheduleToItem (ItemId) nicht in einen anderen Thread ein, sondern machen Sie es sehr schnell, damit Sie es nicht in einen anderen Thread einfügen müssen.

Der einfache Weg, um 2 sehr schnell zu machen, besteht darin, es einfach zu einer Warteschlange hinzuzufügen, anstatt den gesamten Prozess durchzuführen. Lassen Sie sich von einem anderen Prozess diese Warteschlange ansehen, um zu sehen, ob dort neue Elemente zum Planen vorhanden sind, und planen Sie dann das lang laufende Bit.

+0

Danke Conard für Ihren Vorschlag, aber ich glaube nicht, dass ich damit einverstanden bin. 1 Wenn ich sicherstellen muss, dass die gesamte Transaktion atomar ist, wenn beim Hinzufügen des Lieferplans ein Fehler auftritt, möchte ich die Transaktion rückgängig machen. Dies sind Anforderungen, da wir die Datei, die wir verarbeiten möchten, nicht ändern möchten. Für Ihren Vorschlag 2 wollen wir den Prozess beschleunigen, indem Sie sie parallel laufen lassen, weil ein Gegenstand Hunderte von Zeitplänen haben kann und ein Punkt Zehner oder Hunderte von Gegenständen haben kann. – Henry

+0

@Henry. Wenn also einer der Artikel in einer Bestellung nicht geplant werden kann, möchten Sie den gesamten Vorgang rückgängig machen. –

+0

ja das ist richtig. B/c-Benutzer möchte die Datei nicht manuell aktualisieren. – Henry

Verwandte Themen