Tekrarlanamayan Okuma ve Phantom Okuma arasındaki fark nedir?


155

Tekrarlanamayan okuma ve fantom okuma arasındaki fark nedir?

Wikipedia'dan Yalıtım (veritabanı sistemleri) makalesini okudum , ancak birkaç şüphem var. Aşağıdaki örnekte ne olacak: tekrarlanamayan okuma ve fantom okuma ?

İşlem A
SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
ÇIKTI:
1----MIKE------29019892---------5000
İşlem B
UPDATE USERS SET amount=amount+5000 where ID=1 AND accountno=29019892;
COMMIT;
İşlem A
SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1

Başka bir şüphe, yukarıdaki örnekte hangi izolasyon seviyesinin kullanılması gerektiğidir? Ve neden?


Yanıtlar:


166

Wikipedia'dan (bunun için harika ve ayrıntılı örnekleri vardır):

Bir işlem sırasında bir satır iki kez alındığında ve satır içindeki değerler okumalar arasında farklılık gösterdiğinde tekrarlanamayan bir okuma oluşur.

ve

Bir işlem sırasında iki özdeş sorgu yürütüldüğünde ve ikinci sorgu tarafından döndürülen satırların toplanması ilkinden farklı olduğunda, hayali bir okuma gerçekleşir.

Basit örnekler:

  • A kullanıcısı aynı sorguyu iki kez çalıştırır.
  • Arasında, B Kullanıcısı bir işlem yürütür ve taahhüt eder.
  • Tekrarlanamayan okuma: A kullanıcısının sorguladığı A satırının ikinci kez farklı bir değeri vardır.
  • Hayali okuma: Sorgudaki tüm satırlar önce ve sonra aynı değere sahiptir, ancak farklı satırlar seçilmektedir (çünkü B bazılarını silmiş veya eklemiştir). Örnek: select sum(x) from table;etkilenen satırların hiçbiri güncellenmemiş olsa bile, satırlar eklenmiş veya silinmişse farklı bir sonuç döndürür.

Yukarıdaki örnekte, hangi yalıtım seviyesi kullanılacaktır?

İhtiyacınız olan yalıtım seviyesi uygulamanıza bağlıdır. "Daha iyi" bir izolasyon seviyesine (düşük eşzamanlılık gibi) yüksek bir maliyet vardır.

Örneğinizde, yalnızca tek bir satırdan (birincil anahtarla tanımlanmıştır) seçim yaptığınız için hayali bir okunmaz. Tekrarlanamayan okumalarınız olabilir, bu nedenle bir sorun varsa, bunu önleyen bir izolasyon seviyesine sahip olmak isteyebilirsiniz. Oracle'da A işlemi, GÜNCELLEME İÇİN SEÇ seçeneğini de verebilir, ardından A işlemi tamamlanana kadar B işlemi satırı değiştiremez.


6
Böyle bir sözdiziminin mantığını gerçekten anlamıyorum ... Okuma tekrarlandığında (ve farklı bir değer elde edildiğinde) tekrarlanamayan bir okuma gerçekleşiyor ??! ...
serhio 15:30

14
@serhio "tekrarlanamaz", bir değeri bir kez okuyabildiğiniz ve sonuç olarak x elde edebileceğiniz ve sonuç olarak tekrar okuyabileceğiniz ve sonuç olarak y elde edebileceğiniz anlamına gelir. aynı satırın ayrı sorguları, çünkü bu satır değeri okumalar arasında güncellendi.
BateTech

@Thilo Tekrarlanabilir okumanın sorun yaratabileceği ve nerede gerekli olduğu herhangi bir gerçek kullanım örneği var mı?
user104309

PK başka bir işlemde değiştirilirse ne olur? Bu bir hayalet okumasına neden olabilir mi? (Çoğu durumda yapmak garip bir şey, ama imkansız değil.)
jpmc26

1
Her ikisi de bana
benziyor

126

Düşünmeyi sevdiğim basit bir yol:

Hem tekrarlanabilir olmayan hem de hayali okumalar, işlem başladıktan sonra işlenen ve daha sonra işleminiz tarafından okunan farklı bir işlemden veri değiştirme işlemleri ile ilgilidir.

Tekrarlanamayan okumalar, işleminizin başka bir işlemden taahhüt edilen GÜNCELLEMELER'i okuduğu zamandır . Artık aynı satır, işleminiz başladığındakinden farklı değerlere sahip.

Benzer ancak kararlı okurken Phantom okur ıNSERTlerden ve / veya siler başka işlemden. İşleme başladığınızdan beri kaybolan yeni satırlar veya satırlar var.

Kirli okumalar tekrarlanamayan ve hayali okumalara benzer , ancak UNCOMMITTED verilerinin okunmasıyla ilgilidir ve başka bir işlemden bir UPDATE, INSERT veya DELETE okunduğunda ve diğer işlem henüz verileri işlemediğinde gerçekleşir. Tam olmayan ve gerçekte hiçbir şekilde taahhüt edilemeyen "devam eden" verileri okuyor.


4
İşlem izolasyon seviyeleri ve eşzamanlılık ile ilgilidir. Varsayılan yalıtım düzeyini kullanarak, kirli okumalar almayacaksınız ve çoğu durumda kirli okumalardan kaçınmak istersiniz. Kirli okumalara izin verecek yalıtım seviyeleri veya sorgu ipuçları vardır; bu, bazı durumlarda daha yüksek eşzamanlılık elde etmek için kabul edilebilir bir değiş tokuştur veya başka bir bağlantıdan devam eden bir işlemde sorun giderme gibi bir uç durum nedeniyle gereklidir. Kirli bir okuma fikrinin sizin için "koku testini" geçmemesi iyidir, bc genel bir kural olarak, bunlardan kaçınılmalıdır, ancak bir amacı vardır.
BateTech

1
@PHPAvenger burada YETERSİZ izolasyon düzeyini OKU için bir kullanım örneğidir: her zaman bir select ve güncelleme sorgusu ( burada açıklanmaktadır ) arasında bir kilitlenme ile karşılaşma olasılığı vardır . Seçme sorgusu bir kaplama dizini oluşturmak için çok karmaşıksa, kilitlenmeleri önlemek için kirli okumalarla karşılaşma riski olan READ UNCOMMITED yalıtım düzeyini kullanmak istersiniz, ancak bu kirli okumalar hakkında endişelenmek için işlemleri ne sıklıkta geri alırsınız? kalıcı olmak ?!
petrica.martinescu

1
@ petrica.martinescu kirli okumaların neden olduğu sorunlar sadece bir işlemin geri alınıp döndürülmediği DEĞİLDİR. Kirli okumalar, bekleyen işlemlerdeki verilerin nasıl değiştirildiğine bağlı olarak çok yanlış sonuçlar verebilir. Birkaç silme, güncelleme ve / veya ekleme işlemi gerçekleştiren bir işlem düşünün. Bu işlemin ortasındaki verileri "okunmamış okuma" kullanarak okursanız, eksik olur. Anlık görüntü yalıtım düzeyi (SQL Server'da), okunaksız okumak için çok daha iyi bir alternatiftir. Bir üretim sistemindeki okunmamış izolasyon seviyesinin okunması için geçerli bir kullanım durumu nadir IMO'dur.
BateTech

2
@DiponRoy harika bir soru. Tekrarlanabilir okuma (RR) yalıtımı kullanılıyorsa uygulanan kilitleme, seçilen satırlarda silme işlemlerinin olmasını engellemelidir. Yıllar boyunca 2 iso seviyesinin değişen tanımlarını gördüm, esas olarak fantom, koleksiyondaki bir değişiklik / # satırları geri döndü ve RR, aynı satırın değiştiğini söylüyor. Ben sadece güncellenmiş MS SQL belgelerinde silmelerin RR olmayanlara ( docs.microsoft.com/en-us/sql/odbc/reference/develop-app/… ) neden olabileceğini söylediğini kontrol ettim, bu yüzden silmeleri gruplamak güvenli olacaktır RR kategorisi de
BateTech

2
@anir yes ekler ve silmeler kirli okumalara dahil edilir. Örnek: bir işlem başlatın, a bağlantısına 100 fatura satırından 2'sini ekleyin, şimdi b bağlantısı trx tamamlanmadan önce ve diğer 98 satır eklenmeden önce bu 2 satırı okur ve fatura için tüm bilgileri içermez. Bu, bir kesici uç içeren kirli bir okuma olacaktır.
BateTech

28

Bu makalede açıklandığı gibi , Tekrarlanamayan Okuma anomalisi aşağıdaki gibi görünür:

resim açıklamasını buraya girin

  1. Alice ve Bob iki veritabanı işlemi başlatır.
  2. Bob's post kayıt okur ve başlık sütun değeri İşlemler olduğunu.
  3. Alice, belirli bir kayıt kaydının başlığını ACID değerine değiştirir.
  4. Alice veritabanı işlemlerini yapar.
  5. Bob post kaydını tekrar okursa, bu tablo satırının farklı bir versiyonunu gözlemleyecektir.

Gelen bu makalede hakkında Phantom okuyun , aşağıdaki gibi bu anomali olabilir görebilirsiniz:

resim açıklamasını buraya girin

  1. Alice ve Bob iki veritabanı işlemi başlatır.
  2. Bob's, yazı satırı ile ilişkili tüm post_comment kayıtlarını 1 tanımlayıcı değeri ile okur.
  3. Alice, 1 tanımlayıcı değerine sahip yazı satırı ile ilişkili yeni bir post_comment kaydı ekler.
  4. Alice veritabanı işlemlerini yapar.
  5. Bob'un post_id sütun değeri 1'e eşit olan post_comment kayıtlarını yeniden okursa, bu sonuç kümesinin farklı bir sürümünü gözlemleyecektir.

Bu nedenle, Tekrarlanamayan Okuma tek bir satıra uygulanırken, Phantom Read , belirli bir sorgu filtreleme ölçütlerini karşılayan bir dizi kayıtla ilgilidir.


3
üstün görselleştirme @Vlad
dextermini

23

Olguları oku

  • Kirli okumalar : başka bir işlemden UNCOMMITED verilerini okuma
  • Tekrarlanamayan okumalar :UPDATEbaşka bir işlemdengelen birsorgudanCOMMITTED verileri okuyun
  • Fantom okur : Bir den İŞLENEN veri okumakINSERTveyaDELETEbaşka işlemden sorgusu

Not : Başka bir işlemden DELETE ifadeleri, bazı durumlarda tekrarlanamayan okumalara neden olma olasılığı da çok düşüktür. Ne yazık ki DELETE deyimi, geçerli işleminizin sorguladığı satırın aynısını kaldırdığında olur. Ancak bu nadir bir durumdur ve her tabloda milyonlarca satır bulunan bir veritabanında meydana gelme olasılığı daha düşüktür. İşlem verilerini içeren tablolar genellikle herhangi bir üretim ortamında yüksek veri hacmine sahiptir.

Ayrıca, GÜNCELLEMELER'in gerçek INSERT veya DELETES yerine çoğu kullanım durumunda daha sık bir iş olabileceğini gözlemleyebiliriz (bu gibi durumlarda tekrarlanamayan okuma tehlikesi sadece kalır - bu durumlarda fantom okumaları mümkün değildir). Bu nedenle GÜNCELLEŞTİRMELER INSERT-DELETE'den farklı şekilde ele alınır ve ortaya çıkan anomali de farklı adlandırılır.

Ayrıca, yalnızca GÜNCELLEMELERİ işlemek yerine INSERT-DELETE'lerin işlenmesi ile ilişkili ek bir işlem maliyeti vardır.


Farklı izolasyon seviyelerinin faydaları

  • READ_UNCOMMITTED hiçbir şeyi engellemiyor. Sıfır izolasyon seviyesidir
  • READ_COMMITTED yalnızca birini önler, yani Kirli okumalar
  • REPEATABLE_READ iki anormalliği önler: Kirli okumalar ve tekrarlanamayan okumalar
  • SERIALIZABLE üç anormalliği de önler: Kirli okumalar, tekrarlanamayan okumalar ve Phantom okumaları

O zaman neden sadece her zaman SERIALIZABLE işlemini ayarlamıyorsunuz? Yukarıdaki sorunun cevabı şudur: SERİLEŞTİRİLEBİLİR ayar işlemleri çok yavaş yapar , bu da yine istemiyoruz.

Aslında işlem süresi tüketimi aşağıdaki orandadır:

SERIALIZABLE > REPEATABLE_READ > READ_COMMITTED > READ_UNCOMMITTED

Bu nedenle READ_UNCOMMITTED ayarı en hızlısıdır .


özet

Aslında işlem vakasını analiz etmemiz ve bir izolasyon seviyesine karar vermemiz gerekiyor, böylece işlem süresini optimize ediyoruz ve çoğu anormalliği önlüyoruz.

Veritabanlarının varsayılan olarak REPEATABLE_READ ayarına sahip olduğunu unutmayın.


1
UPDATE veya DELETE her ikisi de tekrarlanamayan okumalar için gerçekleşebilir veya yalnızca UPDATE mi?
Dipon Roy

1
UPDATE veya DELETE tekrarlanamayan okumalar için gerçekleşebilir
niket patel

Aslında, aynı veritabanında başka bir işlem tarafından yürütülen rastgele bir DELETE deyiminin, geçerli işlem için tekrarlanamayan okumalara neden olma olasılığının çok düşük olduğunu özetleyebiliriz. Ancak aynı delete deyimi, mevcut işlem için bir Phantom'un okunmasına neden olma olasılığının% 100'üne sahiptir. Bu şekilde baktığımda, kelime için kelime alırsanız yazım biraz yanlıştır. Ama hey, bunu okuyucuya daha net hale getirmek için bilerek bu şekilde yazdım.
Subhadeep Ray

Basit ve anlaşılması kolay bir açıklama için +1. Ancak çoğu veritabanının (oracle, mysql) varsayılan okuma düzeyi kabul edildiğini düşünüyorum ve muhtemelen postgress repeatable_read varsayılan kullanır
akila

7

Bu iki tür izolasyon seviyesi arasında uygulamada bir fark vardır.
"Tekrarlanamayan okuma" için satır kilitleme gereklidir.
"Fantom okuma" için table kapsamlı kilitleme, hatta bir masa kilitleme gerekir.
Bu iki seviyeyi iki fazlı kilitleme protokolünü kullanarak uygulayabiliriz .


Tekrarlanabilir okuma veya serileştirme uygulamak için satır kilitleme kullanmaya gerek yoktur.
a_horse_with_no_name

5

Tekrarlanamayan okumaları olan bir sistemde, İşlem A'nın ikinci sorgusunun sonucu, İşlem B'deki güncellemeyi yansıtacaktır - yeni tutarı görecektir.

Fantom okumalarına izin veren bir sistemde, eğer İşlem B ID = 1 ile yeni bir satır ekleyecekse , ikinci sorgu yürütüldüğünde İşlem A yeni satırı görecektir; yani fantom okumaları tekrarlanamayan okuma için özel bir durumdur.


Hayali bir okumanın açıklamasının doğru olduğunu düşünmüyorum. Kesin olmayan veriler asla görünmese bile hayali okumalar alabilirsiniz. Wikipedia'daki örneğe bakın (yukarıdaki yorumlarda bağlantılıdır).
Thilo

1

Kabul edilen cevap, ikisinin arasındaki sözde ayrımın aslında hiç de önemli olmadığını gösterir.

"Bir satır iki kez alınır ve satır içindeki değerler okumalar arasında farklılık gösterirse", bunlar aynı satır değildir (doğru RDB konuşmasında aynı grup değildir) ve daha sonra tanım gereği " ikinci sorgu tarafından döndürülen satırlar ilk satırdan farklı ".

"Hangi izolasyon seviyesinin kullanılması gerektiği" sorusu ile ilgili olarak, verileriniz birileri için ne kadar hayati öneme sahipse, bir yerlerde, Serileştirilebilir olanın tek makul seçeneğiniz o kadar fazla olacaktır.


0

Tekrarlanamayan okuma ve hayali okuma arasında bazı farklar olduğunu düşünüyorum.

Tekrarlanamayan, A ve B'nin çekme işlemi olduğu anlamına gelir. B, A'nın modifikasyonunu fark edebiliyorsa, belki de kirli okunur, bu nedenle B'nin A işleminden sonra A'nın modifikasyonunu fark etmesine izin veririz.

Yeni bir sorun var: B'nin A işleminden sonra A'nın değişikliğini fark etmesine izin veriyoruz, A'nın B'nin tuttuğu satır değerini değiştirmesi, B'nin bazen satırı tekrar okuyacağı anlamına gelir, böylece B, ilk kez bizden farklı yeni değer alır olsun, biz tekrarlamak mümkün değil, sorunu ile başa çıkmak için, B başladığında B bir şey hatırlamak izin (çünkü henüz ne hatırlanacak bilmiyorum).

Yeni çözümü düşünelim, yeni bir sorun olduğunu da fark edebiliriz, çünkü B'nin bir şeyi hatırlamasına izin veririz, bu yüzden A'da ne olursa olsun B etkilenemez, ancak B tabloya ve B'ye bazı veriler eklemek istiyorsa kayıt olmadığından emin olmak için tabloyu kontrol edin, ancak bu veriler A tarafından eklenmiştir, bu yüzden bir miktar hata olabilir. Biz buna Phantom-read diyoruz.


0

tekrarlanamayan okuma bir izolasyon seviyesidir ve hayali okuma (diğer işlemlerle kaydedilen değeri okuma) bir kavramdır (okuma türü, örneğin kirli okuma veya anlık okuma). Tekrarlanamayan okuma izolasyon seviyesi fantom okumasına izin verir ancak kirli okumalara veya anlık okumalara izin vermez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.