Ich habe einen WCF-Dienst, der zum Hinzufügen von Angeboten in die Datenbank verwendet wird. Dies ist MS SQL Server 2005. WCF verwendet LINQ-to-SQL.Implementieren von LINQ-zu-SQL-Transaktionen über WCF
Jedes Angebot kann viele Dokumente und viele Artikel enthalten. Die Kunden können ein Objekt pro Serviceaufruf hinzufügen. Das heißt, das tun etwas wie folgt:
TendersServiceClient service = new TenderServiceClient();
service.BeginTransaction();
// Adding a new tender
service.AddTender(TenderDTO tenderInfo);
// Adding tender's documents
foreach (DocumentDTO documentInfo in documents)
service.AddTenderDocument(tenderInfo.TenderID, documentInfo);
// Adding tender's items
foreach (ItemDTO itemInfo in items)
service.AddTenderItem(tenderInfo.TenderID, itemInfo);
service.CommitTransaction();
Beachten Sie die BeginTransaction() und CommitTransaction(). Das heißt, alle oben genannten Verfahren müssen entweder vollständig erfolgreich sein oder vollständig rückgängig gemacht werden. Wenn zum Beispiel eines der Elemente nicht eingefügt werden konnte, sollte das gesamte Angebot nicht existieren ...
Die Frage ist also, wie ich diese Art von Transaktion implementieren. Das Problem ist, dass WCF natürlich staatenlos ist. Daher wird für jeden Serviceaufruf ein neuer DataContext erstellt. Wenn ich stattdessen einen statischen DataContext verwende, kann ich die integrierten Transaktionsfunktionen verwenden, aber wie kann ich dann mit anderen Kunden umgehen, die versuchen, in derselben Zeit ein anderes Zahlungsmittel hinzuzufügen (das muss natürlich sein). außerhalb dieser Transaktion)?
Also bitte helfen Sie mir mit einer Art von Design-Muster, um dies zu erreichen. Ich bin frei, den Code sowohl des Service und des Kunden zu ändern, also fühlen Sie sich frei mit Ihren Vorschlägen =)
Hmm ... IsInitiating und IsTerminating Attribute scheinen wirklich zu sein, was ich brauche. Aber es gibt ein Problem mit TransactionScope auf der Client-Seite: einige meiner Clients sind C++ - nicht verwaltet. Soll ich das Ganze auf der Serverseite implementieren? –
Und können Sie bitte auch darauf hinweisen, wie diese Sache mit LINQ-to-SQL verbindet? Soll ich für jede WCF-Transaktion einen separaten DataContext erstellen oder gibt es eine Möglichkeit, zwischen WCF-Transaktion und LINQ-zu-SQL-Transaktion zu verknüpfen? –
Hallo Dmitry - ok, C++ unmanaged .... das wird hart sein ... –