Code: Select all
CREATE TABLE lock_table (
key_name VARCHAR(255) NOT NULL,
UNIQUE KEY (key_name)
) ENGINE = InnoDB;
- job1 erhält eine Sperre mit:
Code: Select all
SELECT * FROM lock_table WHERE key_name = 'resource1' FOR UPDATE;
- Während Job1 ausgeführt wird, fordern Job2 und Job3 ebenfalls dieselbe Sperre an:
Code: Select all
SELECT * FROM lock_table WHERE key_name = 'resource1' FOR UPDATE;
- Nachdem Job1 abgeschlossen ist, möchte ich die Jobs haben in der Warteschlange (Job2 und Job3), um sie in der Reihenfolge auszuführen, in der sie die Sperre angefordert haben.
< ol>
[*]Garantiert der SELECT ... FOR UPDATE-Mechanismus von MySQL, dass die Jobs (job2 und job3) werden in der Reihenfolge ausgeführt, in der sie die Sperre angefordert haben?
[*]Gibt es einen offiziellen MySQL-Dokumentationslink, der erklärt, wie MySQL die Reihenfolge von Sperranforderungen in der Warteschlange behandelt?[*]Ist dieser Ansatz die beste Vorgehensweise für die Serialisierung der Jobausführung, oder gibt es einen besseren Weg, dies zu erreichen?
Ich entwerfe eine System, in dem mehrere Jobs (Job1, Job2, Job3 usw.) versuchen können, sie zu verarbeiten dieselbe Ressource gleichzeitig verwenden. Um eine serialisierte Ausführung sicherzustellen, verwende ich MySQLs SELECT ... FOR UPDATE, um die Ressource basierend auf ihrem Schlüsselnamen zu sperren.