S'il vous plaît, aidez-moi à comprendre le cas d'utilisation derrière SELECT ... FOR UPDATE
.
Question 1 : Est-ce que ce qui suit est un bon exemple de quand SELECT ... FOR UPDATE
doit être utilisé?
Donné:
- salles [id]
- tags [id, nom]
- room_tags [room_id, tag_id]
- room_id et tag_id sont des clés étrangères
L'application souhaite répertorier toutes les pièces et leurs balises, mais doit différencier les pièces sans balises des pièces qui ont été supprimées. Si SELECT ... FOR UPDATE n'est pas utilisé, ce qui pourrait arriver est:
- Initialement:
- pièces contient
[id = 1]
- balises contient
[id = 1, name = 'cats']
- room_tags contient
[room_id = 1, tag_id = 1]
- pièces contient
- Fil 1:
SELECT id FROM rooms;
returns [id = 1]
- Fil 2:
DELETE FROM room_tags WHERE room_id = 1;
- Fil 2:
DELETE FROM rooms WHERE id = 1;
- Thread 2: [valide la transaction]
- Fil 1:
SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;
- renvoie une liste vide
Maintenant, le fil 1 pense que la salle 1 n'a pas de balises, mais en réalité la salle a été supprimée. Pour résoudre ce problème, Thread 1 devrait SELECT id FROM rooms FOR UPDATE
, empêchant ainsi la suppression de Thread 2 rooms
jusqu'à ce que Thread 1 soit terminé. Est-ce exact?
Question 2 : Quand faut-il utiliser l' SERIALIZABLE
isolation des transactions par rapport à READ_COMMITTED
avec SELECT ... FOR UPDATE
?
Les réponses devraient être portables (et non spécifiques à la base de données). Si ce n'est pas possible, veuillez expliquer pourquoi.
REPEATABLE_READ
et READ_COMMITTED
même les options portables? Les seuls résultats que j'obtiens pour ceux-ci sont pour le serveur MSSQL
READ COMMITTED
mode ne définit pas si vous verrez ou non les enregistrements validés par une autre transaction: cela garantit seulement que vous ne verrez jamais les enregistrements non validés.
select ... for update
on rooms
permettra toujours room_tags
d'être supprimé car ce sont des tables séparées. Vouliez-vous demander si la for update
clause empêchera les suppressions rooms
?