2017-07-03 1 views
0

Ich habe die folgende Situation:
Ich habe eine Liste von Elementen von mehreren Benutzern angezeigt, jedes Element kann von einem einzelnen Benutzer erworben werden, indem Sie auf den Button "erwerben" in der rechten der einzelnen Artikel klicken, Ich frage mich, ob es ausreicht, den Status des Elements zu überprüfen (ein boolescher Wert in der Items-Tabelle: true/false), um sicherzustellen, dass ein Element nicht von mehr als einem Benutzer erworben werden kann. oder gibt es eine praktische Möglichkeit, das in PHP/MySQL zu tun? Herzlich, Youssef.Nebenläufigkeit in PHP/MYSQL

Antwort

1

Ich frage mich, ob das Überprüfen des Status des Elements (ein Boolean in Items Tabelle erworben: True/False) genug ist, um sicherzustellen, dass ein Element nicht von mehr als einem Benutzer erworben werden kann?

Hängt davon ab, wie Sie es verwenden. Wenn Ihr Code etwas entlang der Linien dieses tut:

if (current status of item is "free") { 
    update status of item to "taken"; 
} 

dann es nicht, weil es eine Lücke gibt zwischen dem „check“ und „update“, wo ein anderer Prozess in rutschen könnte und das Element nehmen für sich selbst! Wenn Sie eine Spalte, um anzuzeigen, jedoch haben die Benutzer ein Element behauptet hat, etwas entlang der Linien dieser SQL-Abfrage funktionieren würde:

UPDATE items SET claimed_by = :current_user 
    WHERE item_id = :id AND claimed_by IS NULL 

Diese Abfrage wird sich weigern, ein Element zu aktualisieren, die bereits beansprucht ist, und Sie können überprüfen die claimed_by des Artikels, um sicherzustellen, dass Sie es vor dem Fortfahren bekommen.

+0

Das Problem ist, dass ich muss aktualisieren und einige Fragen einfügen, kann ich die Aktualisierung zurück zu überprüfen, um zu überprüfen, ob das Update passiert ist oder nicht? und auf der Grundlage dieser Antwort entscheide ich, ob ich Abfragen einfüge oder nicht. Wird das 100% funktionieren? Ich meine, wenn zwei Benutzer die Aktualisierungsabfrage zur gleichen Zeit ausführen? (Ist das möglich? ^^ ') – hereForLearing

+0

Sie können entweder die Anzahl der von der UPDATE-Abfrage aktualisierten Zeilen überprüfen oder einen SELECT-Befehl ausführen und den neuen Wert von 'beanspruchte_by' untersuchen. Zur Nebenläufigkeit: Der Datenbankserver wird die Abfragen serialisieren. Unabhängig davon, wie viele dieser Abfragen gleichzeitig ausgeführt werden, aktualisiert nur einer von ihnen den Wert von 'required_by', und der Rest tut nichts. – duskwuff

+0

Ok Sir danke, ich habe deine Antwort akzeptiert. – hereForLearing

2

In reinem PHP nein, wie eine PHP-Seite nicht im laufenden Betrieb aktualisieren kann.

Die Verwendung von AJAX ist jedoch möglich. Ob es praktisch ist, ist eine andere Geschichte, da es von der Anzahl der Elemente abhängt, gegen die Sie überprüfen möchten. Selbst dann wird es immer eine Verzögerung geben, die abhängig von der Servergeschwindigkeit, der Benutzerverbindungsgeschwindigkeit usw. ist.

Ihre beste Wette wäre, eine Nachricht zu haben, die etwas wie "Überprüfung" sagt, sobald ein Benutzer gepresst hat, Machen Sie den Check mit AJAX, und wer zuerst kommt, bekommt immer noch den Artikel.

Also Ihr nächster Schritt wäre, AJAX (Javascript) nachzuschlagen.

Die Alternative besteht darin, einen vollständigen Neuladen der Seite durchzuführen, um zu prüfen, ob der Artikel noch verfügbar ist, und vorher einen Haftungsausschluss anzuzeigen, dass dies geschieht. Dieser Ansatz dauert aufgrund des vollständigen Neuladens der Seite nur länger als die Verwendung von AJAX.

+1

Vielen Dank für Ihre Antwort, ich möchte nicht, dass das Element aus dem Benutzerbildschirm verschwinden, alles was ich will ist, wenn zwei Benutzer gleichzeitig klicken, um nur eins zu erhalten, wird das Element erhalten. – hereForLearing

+2

@saywow dann AJAX ist der Weg zu gehen. –

+0

Ajax ist nicht die Lösung für mein Problem, da, wie ich im Kommentar erklärt habe, mein Problem nicht darin besteht, das nicht verfügbare Objekt zu verbergen, sondern für den Fall, dass zwei Benutzer dasselbe Objekt zur gleichen Zeit erhalten wollen: beide klicken ein die gleiche Zeit erwerben beide prüfen, ob Artikel verfügbar, in diesem Fall wird die Antwort ja sein, so dass die beiden es erwerben (das wird einen Fehler verursachen, da in meiner Datenbank eine Eins-zu-viele-Beziehung) so was kann ich tun vermeide den Fehler – hereForLearing