Lütfen arkasındaki kullanım durumunu anlamama yardım edin SELECT ... FOR UPDATE
.
Soru 1 : Aşağıdaki, ne zaman SELECT ... FOR UPDATE
kullanı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 rooms
1. İplik tamamlanana kadar silinmesini engellemelidir . Bu doğru mu?
Soru 2 : Ne zaman bir kullanmalıdır SERIALIZABLE
işlem yalıtım karşı READ_COMMITTED
olan 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_READ
ve READ_COMMITTED
hatta taşınabilir seçenekler mi? Bunlar için aldığım tek sonuç MSSQL sunucusu için
READ COMMITTED
mod 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 update
on , ayrı tablolar oldukları için silinmeye rooms
yine de izin verecektir room_tags
. for update
Maddenin silinmeleri engelleyip engellemeyeceğini rooms
mi sormak istediniz ?