SORU
7 HAZİRAN 2012, PERŞEMBE


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
7 Mayıs 2013, Salı


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 da SELECT DELETE sorgu bir oturum tamamlar kadar kilitlenir.

  • Veritabanları kullanım MVCC (gibi Oracle, PostgreSQL, MySQL InnoDB), a DML 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 ya SELECT DELETE sorgu kilit olur, SQL Server yaptığı gibi. bu veritabanları için SELECT 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 önceki PostgreSQL sürümleri REPEATABLE READ aslında SERIALIZABLE 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 gerekir

  • InnoDB, REPEATABLE READ SERIALIZABLE farklı şeyler: okuyucular SERIALIZABLE moduna ayarlı bir sonraki anahtar kilitleri kayıtları değerlendirir, etkili bir biçimde önlenmesi, eşzamanlı DML onları. Seri hale getirilebilir modunda SELECT FOR UPDATE ihtiyacın yok, ama REPEATABLE 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".

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • Matt Davis

    Matt Davis

    4 ŞUBAT 2006
  • RaquelGamesBR

    RaquelGamesB

    20 HAZİRAN 2009