mgutt hat geschrieben:Ihr vergesst, dass es passieren kann (in der Millesekunde), dass nahezu synchron mehrere User den ersten SELECT ausführen können, bevor beim allerersten User der INSERT fertig ist.
D.h. es wird schon nach und nach abgearbeitet, aber in der Zeit zwischen den beiden Abfragen, kann es durchaus sein, dass noch ein SELECT eines anderen durchhuscht.
Ich hatte das bereits mehrmals in einem extrem frequenten Thema. Dort "beschwerten" sich User, dass ihr Beitrag erst auf Seite X und dann auf Seite Y angezeigt wurde. Weil dort ein weiterer User parallel geschrieben hat (INSERT) und dieser aber noch nicht vom SELECT erfasst werden konnte.
bei meiner Lösung nicht... (siehe unten beim edit)
ERST wird insert in 'soll-Seite-sehen' gemacht. erst DANACH wird in der GLEICHEN PHP datei nach der niedrigsten Tabellen ID gefragt.
Selbst wenn 2 user gleichzeitig drücken, wird nur einer die niedrige ID bekommen, darum kümmert sich mySQL
durch die Select Abfrage nach dem insert auf die gleiche Tabelle weisst du anschliessend wer als erster war (wie gesagt, die ID's werden von MySQL generiert - und nur einmal vergeben - das heisst es gibt immer eine niedrige ID, und NUR DIE hat gewonnen - alle anderen haben zwar den insert ausgeführt - aber eine höhere id und dürfen die Seite oder das Gewinsspiel NICHT sehen
also:
entscheidend ist bei mir nicht das insert, sondern das select von dem insert
das ist 100% sicher
von Sonderfällen wie Hacker angriff, mutwillige Änderung der Datenbank, Serverabstürze, etc abgesehen - aber ich glaube die darf man hier vernachlässigen
EDIT:
Bsp mit 2 Usern u1 und u2, Gewinnspiel g1
u1 findet Gewinnspiel
u2 findet Gewinnspiel
u1 trägt ein als 'soll-sehen'
(ID = 1 [mysql autoincrement], u1, g1)
u2 trägt ein als 'soll-sehen'
(ID = 2 [mysql autoincrement], u2, g1)
u1 macht select, Limit 1, orderBy ID wo gewinnspiel g1 auf 'sollen-sehen'
Eintrag: 1, u1, g1
hat gewonnen
u2 macht select, Limit 1, orderBy ID wo gewinnspiel g1 auf 'sollen-sehen'
Eintrag: 1, u1, g1
hat verloren, trotz insert !!
hiernach kann gewinnspiel g1 deaktivert werden damit nicht noch mehr inserts kommen
möglichkeit: trage als Gewinner - aber erst jetzt u1 ein
lösche hiernach alle einträge mit g1 aus der Tabelle 'soll-sehen'