Kullanma zamanı ... GÜNCELLEŞTİRMEK İÇİN SEÇİN?
Bana bu durum kullanın. SELECT ... FOR UPDATE
arkasında anlamak lütfen.
Soru 1: Aşağıdaki SELECT ... FOR UPDATE
Ne zaman kullanılmalı iyi bir örnektir?
Verilen:
- oda[ıd]
- etiketler[ıd, adı]
- room_tags[room_id, tag_id]
- room_id ve tag_id yabancı anahtarları
Uygulama tüm odalar ve künyelerini liste istiyor, ama hiçbir etiketleri ile odalar karşı kaldırılan odalar arasında ayrım yapmak gerekir. Eğer SEÇMEK ... GÜNCELLEME kullanılmadığı İÇİN, neler olabileceğini
- Başlangıçta:
- Oda içerir [id = 1]
- etiketler içerir [ıd = 1, ad = 'cats']
- room_tags içerir [, tag_id = 1 room_id = 1]
- İş parçacığı 1: oda SEÇİN kimliği;
- döner [id = 1]
- İplik 2: SİL room_tags NEREDE room_id = 1;
- İplik 2: ıd odaları SİL = 1;
- 2 iş parçacığı: [hareketi tamamlar]
- İş parçacığı 1: SEÇİN etiket.room_tags, NEREYE etiketler room_tags adı.tag_id = 1 VE etiketler.id = room_tags.tag_id;
- boş bir listesini döndürür
Şimdi İplik 1 oda 1 Etiket yok olduğunu düşünür, ama gerçekte oda kaldırıldı. Bu sorunu çözmek için, İplik 1 2**, böylece İplik 1 bitene kadar rooms
silme konu 2 engelliyor. Bu doğru mu?
Soru 2Ne zaman bir SELECT ... FOR UPDATE
READ_COMMITTED
karşı SERIALIZABLE
hareket yalıtım kullanmalısınız?
Cevap taşınabilir (veritabanı özgü değil) olması bekleniyor. Eğer bu mümkün değilse, lütfen nedenini açıklayınız.
CEVAP
Sadece taşınabilir şekilde oda ve etiketler arasında tutarlılık sağlamak için, ve silindikten sonra oda bir daha dönmemiş olduğundan emin olun SELECT FOR UPDATE
ile kilitleme.
Bazı sistemlerde ancak kilitleme, eşzamanlılık kontrolü yan etkisi, ve açıkça FOR UPDATE
belirtmeden aynı sonuçları elde.
Bu sorunu çözmek için, İplik 1 9**, böylece İplik 1 bitene kadar
rooms
silme konu 2 engelliyor. Bu doğru mu?
Bu veritabanı sistemi kullanıyor eşzamanlılık denetimi bağlıdır.
MySQL
11 * (ve birkaç diğer eski sistemleri) bir sorgu süresince bütün tablo kilitleyin.SQL Server
,SELECT
sorgular yerde paylaşılan kilitleri kayıtları / sayfa / tabloları incelerken ...DML
sorgu güncelleştirme kilitleri (daha sonra terfi için özel veya düşürülmüş paylaşılan kilitler). Özel kilit paylaşılan kilitleri ile uyumlu değildir, ya daSELECT
DELETE
sorgu bir oturum tamamlar kadar kilitlenir.Veritabanları kullanım
MVCC
(gibiOracle
,PostgreSQL
,MySQL
InnoDB
), aDML
sorgu oluşturur bir kopyasını kaydeder (veya başka bir şekilde) ve genellikle okuyucular kapatmayın yazarlar ve tersi. Başka bir oturumu tamamlar kadar yaSELECT
DELETE
sorgu kilit olur,SQL Server
yaptığı gibi. bu veritabanları içinSELECT FOR UPDATE
kullanışlı gelirdi:
Ne zaman bir
SELECT ... FOR UPDATE
29 *karşı* 28 *hareket yalıtım kullanmalısınız?
Genel olarak, REPEATABLE READ
hayalet satır (çıktı veya değiştirilmiş yerine başka bir hareket içinde kayboldu, o satırlar) yasaklamaz
Oracle
öncekiPostgreSQL
sürümleriREPEATABLE READ
aslındaSERIALIZABLE
ile eş anlamlıdır. Temel olarak, bu işlem değişiklikleri başladıktan sonra yapılır anlamına gelir. Bu Kur,Thread 1
en son sorgu ise asla olabilir ya da istediğin şey olmayabilir) silinmiş gibi odasına geri dönecek. Eğer silindikten sonra oda göstermek istiyorsanız Eğer,SELECT FOR UPDATE
ile satırları kilitlemek gerekirInnoDB
,REPEATABLE READ
SERIALIZABLE
farklı şeyler: okuyucularSERIALIZABLE
moduna ayarlı bir sonraki anahtar kilitleri kayıtları değerlendirir, etkili bir biçimde önlenmesi, eşzamanlıDML
onları. Seri hale getirilebilir modundaSELECT FOR UPDATE
ihtiyacın yok, amaREPEATABLE READ
READ COMMITED
onlara ihtiyacımız var.
Yalıtım modları standart, sorgularda bazı tuhaflıklar görmüyorum reçete yok ama nasıl tanımlamıyor (ya MVCC
ile kilitleme veya başka türlü) unutmayın.
Dediğimde "SELECT FOR UPDATE
ihtiyacın yok" gerçekten eklemeliydi "bazı Veritabanı Altyapısı uygulamasının yan etkileri nedeniyle".
T-SQL: UPDATE deyimi bir DURUMDA belir...
Doğru kullanımı Android kullanıcısı Yö...
Düzenli ifade bir e-posta adresi doğru...
Yapı kullanma zamanı mı?...
Nasıl bir gerçekleştirmek için bir SQL...