Merci de m'aider à comprendre les cas d'utilisation derrière SELECT ... FOR UPDATE
.
Question 1: Est la suite d'un bon exemple de cas SELECT ... FOR UPDATE
doit être utilisé?
Donnée:
- les chambres[id]
- les balises[id, nom]
- room_tags[room_id, tag_id]
- room_id et tag_id sont des clés étrangères
L'application veut la liste de toutes les salles et les balises, mais doit différencier entre des chambres avec pas de tags contre les chambres qui ont été enlevés. Si SELECT ... FOR UPDATE n'est pas utilisé, ce qui peut arriver, c'est:
- Dans un premier temps:
- chambres contient [id = 1]
- tags contient [id = 1, nom = 'chats']
- room_tags contient [room_id = 1, tag_id = 1]
- Thread 1: SELECT id from chambres;
- renvoie [id = 1]
- Filetage 2: SUPPRESSION DE room_tags OÙ room_id = 1;
- Filetage 2: SUPPRESSION DE chambres where id = 1;
- Filetage 2: [valide la transaction]
- Thread 1: SÉLECTIONNER des étiquettes.nom DE room_tags, balises OÙ room_tags.tag_id = 1 ET balises.id = room_tags.tag_id;
- retourne une liste vide
Maintenant Thread 1 pense que la pièce n ° 1 n'a pas de balises, mais en réalité, la chambre a été supprimé. Pour résoudre ce problème, le Thread 1 devrait SELECT id FROM rooms FOR UPDATE
, empêchant ainsi le Thread 2 à partir de la suppression de rooms
jusqu'à ce que le Thread 1 est terminé. Est-ce exact?
Question 2: Quand doit-on utiliser SERIALIZABLE
d'isolation de la transaction contre READ_COMMITTED
avec SELECT ... FOR UPDATE
?
Les réponses sont attendues pour être portable (pas de base de données spécifique). Si ce n'est pas possible, veuillez expliquer pourquoi.