Question

J'ai un utilisateur contenant table InnoDB, comme ceci:

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

Sur chaque insert I incrémenter user_id par 1 ainsi, par exemple, la prochaine user_id pour Bob sera 4

J'utilise cette requête pour le faire:

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

Maintenant, je dois faire en sorte que deux utilisateurs différents ne pas ajouter un « Bob » en même temps. Je ne veux pas de deux Bobs avec user_id 4. Chacun des codes d'utilisateur de Bob doit être différent.

Est-il possible d'écrire et de verrouillage de mise à jour toutes les lignes de Bob lorsque la requête d'insertion ci-dessus est exécuté? Je ne peux pas bloquer toute la table parce que beaucoup d'autres utilisateurs ont encore besoin d'un accès complet à leurs lignes. En outre, toutes les lignes doivent être lisibles en tout temps. Comment puis-je faire?

Était-ce utile?

La solution

En supposant InnoDB ici, vous pouvez utiliser SELECT. .. LOCK IN SHARE MODE pour verrouiller les lignes lorsque vous les sélectionnez.

Autres conseils

Pour résoudre la première partie de votre question, créer un index unique sur user_id et son nom.

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

Cela permettra d'éviter double user_id, les enregistrements de noms.

La réponse à cette question est la même chose que celui-ci . InnoDB se verrouille plus de lignes ici que prévu pour la sécurité avec la journalisation binaire basé sur une instruction.

La solution:. utiliser la ligne sur la base de la consignation binaire avec le niveau d'isolation de lecture engagé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top