Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Optimierung der MySql-Logik

Das Problem ist, dass Sie versuchen, Sperren auf MySQL-Ebene zu verwenden, um sicherzustellen, dass ein Ticket nicht mehr als einer Person zugewiesen werden kann. Auf diese Weise kann nicht erkannt werden, ob ein Ticket von einem Benutzer gesperrt ist.

Ich würde eine Sperre auf Anwendungsebene implementieren, indem ich der Tickets-Tabelle zwei sperrenbezogene Felder hinzufüge:einen Zeitstempel, als die Sperre angewendet wurde, und ein Benutzer-ID-Feld, das Ihnen mitteilt, welcher Benutzer die Sperre besitzt. Die sperrbezogenen Felder können in einer anderen Tabelle gespeichert werden (für diesen Zweck kann beispielsweise ein Einkaufswagen verwendet werden).

Wenn ein Benutzer ein Ticket auswählt, versuchen Sie, diese Sperrfelder mit einer bedingten Aktualisierungsanweisung zu aktualisieren:

update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null

Werte anstelle von ... werden von Ihrer Anwendung bereitgestellt. lock_time is null Kriterien sollen sicherstellen, dass, wenn das Ticket bereits von einem anderen Benutzer ausgewählt wurde, der spätere Benutzer die Sperre nicht aufhebt. Überprüfen Sie nach der Update-Anweisung die Anzahl der betroffenen Zeilen. Wenn dies der Fall ist, hat der aktuelle Benutzer die Sperre erworben. Wenn es 0 ist, dann hat jemand anderes das Ticket gesperrt.

Wenn Sie die Sperrdaten in einer anderen Tabelle haben, platzieren Sie eine eindeutige Einschränkung für das Ticket-ID-Feld in dieser Tabelle und verwenden Sie Einfügen, um eine Sperre zu erhalten. Wenn die Einfügung erfolgreich ist, wird die Sperre erworben. Wenn dies fehlschlägt, hat ein anderer Benutzer das Ticket gesperrt.

Die Sperre wird normalerweise für einige Minuten gehalten, danach muss Ihre Anwendung die Sperre freigeben (Sperrfelder auf null setzen oder den Sperrdatensatz aus der anderen Tabelle löschen).