Vor Kurzem muss ich ein Registrierungssystem schreiben, das nicht viel Parallelität aufweist, aber dennoch die Möglichkeit bietet, dass sich mehrere Personen gleichzeitig anmelden. Da die Registrierung Priorität hat und keine Zeilen- oder Tabellensperre durchgeführt wird, tritt die folgende Situation ein:
Beispiel:
Derzeit hat sich nur Benutzer A im System angemeldet, und die Reihenfolge lautet 1. Datensatz ist (A, 1);
Zu einem bestimmten Zeitpunkt t haben sich Benutzer B, Benutzer C und Benutzer D gleichzeitig registriert. Das Backend hat die Registrierungsanfragen von B, C und D erhalten Fast gleichzeitig hat es das Registrierungsformular abgefragt und festgestellt, dass es derzeit nur (A, 1) gibt, also fügen Sie (B, 2), (C, 2), (D, 2) in das Registrierungsformular ein Erhalten Sie das Ergebnis:
(A, 1)
(B, 2)
(C, 2)
(D, 2).
Das erste, was mir einfiel, war: Ich zeichne nicht die Bestellung auf, sondern den Einfügezeitstempel. In diesem Fall ist es
(A, ta)
(B, tb)
(C, tc)
(D, td).
Es ist fast unmöglich, dass ta, tb, tc, td gleich sind.
Verwandte Empfehlungen: „ThinkPHP Tutorial“
Es gibt jedoch drei Probleme, die dadurch nicht gelöst werden können:
1 Die Zeitstempel können gleich sein. Die Wahrscheinlichkeit ist sehr gering.
2. Es ist nicht intuitiv, nach Zeitstempel zu sortieren.
3 40 Personen, und sofort Rückmeldung, ob die aktuelle Anmeldung angemeldet ist.
Die aktuelle Lösung besteht darin, die Datenbank zu sperren.
Nachdem ThinkPHP viele Informationen online überprüft hat, kann es pessimistisches Sperren und optimistisches Sperren hinzufügen. Das Zielsystem verfügt nur über einen geringen Zugriffsumfang. Verwenden Sie daher einfach pessimistische Sperren.
MyISAM kann nur Tabellen sperren, während InnoDB Zeilen sperren kann. Sperren Sie einfach die Tabelle auf dem Zielsystem.
Das im offiziellen Dokument angegebene Sperrtabellenschema lautet:
$User->lock(true)->save($data);// 使用悲观锁功能
Da das Zielsystem jedoch eine Reihe von Vorgängen ausführen muss, lautet der verwendete Sperrtabellencode:
M()->query("lock tables yourtable write"); // TODO // your code M()->query("unlock tables");
Der tatsächliche Effekt läuft. Der Effekt ist nicht schlecht [das tatsächliche Datum wurde herausgefiltert]:
??-??-?? 10:00:00 1 ??-??-?? 10:00:00 2 ??-??-?? 10:00:00 3 ??-??-?? 10:00:00 4 ??-??-?? 10:00:01 5 ??-??-?? 10:00:01 6 ??-??-?? 10:00:01 7 ??-??-?? 10:00:01 8 ??-??-?? 10:00:02 9 ??-??-?? 10:00:02 10 ??-??-?? 10:00:02 11 ??-??-?? 10:00:02 12 ??-??-?? 10:00:02 13 ??-??-?? 10:00:02 14 ??-??-?? 10:00:03 15 ??-??-?? 10:00:03 16 ??-??-?? 10:00:03 17 ??-??-?? 10:00:05 18 ??-??-?? 10:00:06 19 ??-??-?? 10:00:07 20 ??-??-?? 10:00:08 21 ??-??-?? 10:00:10 22 ??-??-?? 10:00:15 23 ??-??-?? 10:00:17 24 ??-??-?? 10:00:19 25 ??-??-?? 10:00:19 26 ??-??-?? 10:00:24 27 ??-??-?? 10:00:25 28 ??-??-?? 10:00:34 29 ??-??-?? 10:00:35 30 ??-??-?? 10:00:38 31 ??-??-?? 10:01:06 32 ??-??-?? 10:01:11 33 ??-??-?? 10:01:11 34 ??-??-?? 10:01:17 35 ??-??-?? 10:01:18 36 ??-??-?? 10:02:27 37 ??-??-?? 10:02:38 38 ??-??-?? 10:02:39 39 ??-??-?? 10:02:57 40
Das obige ist der detaillierte Inhalt vonSo sperren Sie die Tabelle in thinkphp. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!