Lütfen arkasındaki kullanım durumunu anlamama yardım edin SELECT ... FOR UPDATE.
Soru 1 : Aşağıdaki, ne zaman SELECT ... FOR UPDATEkullanılması gerektiğine dair iyi bir örnek mi?
Verilen:
- Odalar [kimlik]
- etiketler [id, name]
- room_tags [room_id, tag_id]
- room_id ve tag_id yabancı anahtarlardır
Uygulama tüm odaları ve etiketlerini listelemek istiyor, ancak etiketsiz odalar ile kaldırılmış odalar arasında ayrım yapması gerekiyor. SELECT ... FOR UPDATE kullanılmazsa, ne olabilir:
- Başlangıçta:
- odalar içerir
[id = 1] - etiketler içerir
[id = 1, name = 'cats'] - room_tags şunu içerir:
[room_id = 1, tag_id = 1]
- odalar içerir
- Konu 1:
SELECT id FROM rooms;returns [id = 1]
- Konu 2:
DELETE FROM room_tags WHERE room_id = 1; - Konu 2:
DELETE FROM rooms WHERE id = 1; - Konu 2: [işlemi gerçekleştirir]
- Konu 1:
SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;- boş bir liste döndürür
Şimdi Konu 1, oda 1'de etiket olmadığını düşünüyor, ancak gerçekte oda kaldırıldı. Bu sorunu çözmek için, İplik 1 SELECT id FROM rooms FOR UPDATE, İplik 2'nin rooms1. İplik tamamlanana kadar silinmesini engellemelidir . Bu doğru mu?
Soru 2 : Ne zaman bir kullanmalıdır SERIALIZABLEişlem yalıtım karşı READ_COMMITTEDolan SELECT ... FOR UPDATE?
Cevapların taşınabilir olması beklenir (veritabanına özgü değil). Bu mümkün değilse lütfen nedenini açıklayın.
REPEATABLE_READve READ_COMMITTEDhatta taşınabilir seçenekler mi? Bunlar için aldığım tek sonuç MSSQL sunucusu için
READ COMMITTEDmod ayarının, başka bir işlem tarafından işlenen kayıtları gerçekten görüp görmeyeceğinizi tanımlamadığı anlamına gelir : yalnızca, kaydedilmemiş kayıtları asla görmeyeceğinizden emin olur.
select ... for updateon , ayrı tablolar oldukları için silinmeye roomsyine de izin verecektir room_tags. for updateMaddenin silinmeleri engelleyip engellemeyeceğini roomsmi sormak istediniz ?