2016-08-02 38 views
1

Ich arbeite an einer Shopping-Website, in der wir nur einzigartige Produkte haben. So können Benutzer die gleichen Produkte gleichzeitig sehen und hinzufügen, aber wenn sie eine Bestellung aufgeben, werden die gleichen Artikel zum Warenkorb hinzugefügt.So sperren Sie ein bestimmtes Stück Code C#

Aber ich habe ein Problem, wie werde ich sicherstellen, dass meine Stelle Bestellcode, wenn sie aufgerufen wird gesperrt werden und alle anderen Anforderungen müssen in der Warteschlange warten, bis es nicht abgeschlossen ist. Ich habe über Lock-Keyword gelesen, aber nicht viel Ahnung. Jede Hilfe wird geschätzt.

Im Folgenden sind einige Schritte für mein Code:

Schritt 1: 3rd-Party-Service aufzurufen, dass Artikel zu sehen verfügbar ist oder nicht Schritt 2: Wenn Artikel verfügbar ist, dann kaufen durch den Aufruf, dass 3rd-Party-Service . Schritt 3: Wenn die Datenbank erfolgreich gekauft wurde, aktualisieren Sie die Datenbank mit Flags usw.

+0

möchten Sie ein Beispiel Ihres Codes zur Verfügung stellen? –

+0

Es hört sich so an, als hätten Sie einen grundsätzlichen Konstruktionsfehler. Anfragen sollten sich nicht gegenseitig stören und Sie sollten keine Sperrung vornehmen müssen, um es zu funktionieren. Wenn wir Ihren Code sehen, können wir herausfinden, was falsch ist. – itsme86

+0

Dies ist nicht, wofür 'Sperren' sind. Sie benötigen einen Weg, um einen Artikel vorübergehend aus dem Inventar zu entfernen, während er sich in einem Personenwagen befindet (wenn ich Ihre Frage richtig verstanden habe). Der beste Weg, den ich denken kann, ist, den Warenkorb in der Datenbank zu haben. dann können Sie immer nach den Wagen fragen, um zu sehen, was Ihr potenzieller Vorrat ist. –

Antwort

4

Sie können den Code auf dem Webserver nicht zuverlässig sperren, da mehrere Webanforderungen in verschiedenen Prozessen ausgeführt werden können (zumindest wenn Sie Ihren Server in der Zukunft aktualisieren) .

Stattdessen sollten Sie sicherstellen, dass die Datenbankänderungen nur einmal erfolgreich ausgeführt werden können und den Fehler bei zweiten Anforderungen ordnungsgemäß behandeln. Datenbankänderungen sind "natürlich" atomar, so dass Ihr Problem mit einigen intelligenten Einfügungen/Aktualisierungen gelöst wird.

+0

@mattis: Es ist nicht nur Datenbank-Updates, ich rufe auch einige externe APIs. – ChupChapCharli

+1

Starten Sie eine Transaktion. Aktualisieren Sie die Datenbank. Wenn es gelingt, weiter mit der externen Apis. Wenn sie Erfolg haben, legen Sie die Transaktion fest. Ansonsten Rollback und Anzeigefehler für den Benutzer. –

+0

Danke, also Sie sagen, ich sollte die Flags in der Datenbank aktualisieren, wenn Artikel verfügbar sind und dann versuchen, es zu kaufen, indem Sie externe API, so dass im Fall, wenn es eine andere Anfrage für diesen Artikel nicht verfügbar, es sei denn, die Transaktion Rollback ist durch einen Fehler. Bitte korrigieren Sie mich, wenn ich falsch verstanden habe. – ChupChapCharli