Frage

Ich habe eine InnoDB-Tabelle Benutzer enthält, wie folgt aus:

+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 1            | Marry                 |
| 2            | Bob                   |
| 1            | John                  |
| 3            | Bob                   |
| 2            | Marry                 |
+--------------+-----------------------+

Auf jeden Einsatz I um 1 so zum Beispiel user_id Erhöhungsschritte, die nächste user_id für Bob sein 4

Ich verwende diese Abfrage zu tun:

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

Jetzt muss ich sicherstellen, dass zwei verschiedene Benutzer hinzufügen, keine ‚Bob‘ zugleich. Ich will keine zwei Bobs mit User_id 4. Jeder von Bobs Benutzer-IDs müssen unterschiedlich sein.

Ist es möglich, zu schreiben und Update-Sperre all Bobs Reihen, wenn die obigen Einsatz Abfrage ausgeführt wird? Ich kann nicht die gesamte Tabelle sperren, weil viele andere Benutzer noch vollen Zugriff auf ihre Reihen benötigen. Auch alle Zeilen sollten jederzeit lesbar sein. Wie würde ich das tun?

War es hilfreich?

Lösung

Unter der Annahme, InnoDB, können Sie SELECT verwenden. .. LOCK IN SHARE MODE die Zeilen zu sperren, wenn Sie sie auswählen.

Andere Tipps

Um den ersten Teil Ihrer Frage zu lösen, erstellen Sie einen eindeutigen Index für user_id und Namen.

alter table `users` add unique index ak_user_id_name(user_id,name);

Das wird verhindern, dass doppelte user_id, Namenseinträge.

Die Antwort auf diese Frage ist die gleiche wie dieses . InnoDB werden mehr Zeilen sperren hier, als Sie für die Sicherheit mit anweisungsbasierten Binärlogging erwartet.

Die Lösung:. Verwendung Reihe basierend Binärlogging mit der Read-engagierter Isolationsstufe

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top