“Okuma tamamlandı” ve “tekrarlanabilir okuma” arasındaki fark


245

Yukarıdaki izolasyon seviyelerinin birbirine benzediğini düşünüyorum. Birisi temel farkın ne olduğunu bazı güzel örneklerle açıklayabilir mi?


3
Soruyu genişletmeli ve bahsettiğiniz "yalıtım düzeyi" ne (Java vb.) İlişkin etiketler eklemelisiniz. "izolasyon seviyesi" biraz belirsiz bir terimdir ve belli bir ortam için açık bir cevap istiyorsunuz.
jesup

Yanıtlar:


564

Okuma herhangi bir veri okuma olduğunu bildirmiş olduğu bir yalıtım düzeyi kararlı işlediği anda okunur. Okuyucunun herhangi bir ara, taahhüt edilmemiş, 'kirli' okumayı görmesini kısıtlar. İşlem, okumayı yeniden yayınlarsa, Aynı verileri bulacağına dair herhangi bir söz vermez , verilerin okunduktan sonra ücretsiz olarak değiştirilebileceğine dair bir söz vermez .

Tekrarlanabilir okuma daha yüksek bir izolasyon seviyesidir, okunan taahhütlü seviyenin garantilerine ek olarak, okunan herhangi bir verinin değişemeyeceğini garanti eder , işlem aynı verileri tekrar okursa, önceden okunan verileri yerinde, değişmeden bulur ve okunabilir.

Bir sonraki yalıtım düzeyi, seri, daha da güçlü bir garanti yapar: Her şey tekrarlanabilir için ilave garantiler okumak içinde, aynı zamanda garanti hiçbir yeni veri bir sonraki okuma tarafından görülebilir.

Diyelim ki içinde bir satır C olan bir tablonuz var, '1' değerine sahip. Ve aşağıdaki gibi basit bir göreviniz olduğunu düşünün:

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

Bu, T tablosundan iki okuma yaparak aralarında 1 dakikalık bir gecikme olan basit bir görevdir.

  • DEVAM EDİLDİĞİNİ OK altında, ikinci SELECT herhangi bir veri döndürebilir . Eşzamanlı bir işlem kaydı güncelleyebilir, silebilir, yeni kayıtlar ekleyebilir. İkinci seçim her zaman yeni verileri görür .
  • REPEATABLE READ altında, ikinci SELECT öğesinin en azından ilk SELECT öğesinden döndürülen satırları değişmeden görüntülemesi garanti edilir . Bir dakika içinde eşzamanlı bir işlemle yeni satırlar eklenebilir, ancak mevcut satırlar silinemez veya değiştirilemez.
  • SERIALIZABLE ikinci seçme okur altında görmeye garanti tam birinciyle aynı satırları. Eşzamanlı bir işlemle hiçbir satır değiştirilemez, silinemez veya yeni satırlar eklenemez.

Yukarıdaki mantığı takip ederseniz, SERİLEŞTİRİLEBİLİR işlemlerin sizin için hayatı kolaylaştırabildiğini, ancak kimsenin değiştirmesini, silmesini veya herhangi bir satır eklemesini gerektirmediğinden, her olası eşzamanlı işlemi her zaman tamamen engellediğini hızlı bir şekilde anlayabilirsiniz. Net System.Transactionskapsamının varsayılan işlem yalıtım düzeyi serileştirilebilir ve bu genellikle sonuçlanan uçsuz bucaksız performansı açıklar.

Ve son olarak, SNAPSHOT izolasyon seviyesi de vardır. SNAPSHOT yalıtım seviyesi serileştirilebilirlikle aynı garantileri sağlar, ancak eşzamanlı işlemin verileri değiştirmesini gerektirmez. Bunun yerine, her okuyucuyu kendi dünya sürümünü görmeye zorlar (kendi 'anlık görüntüsü'). Bu, eşzamanlı güncellemeleri engellemediği için programlamayı çok kolay ve ölçeklenebilir hale getirir. Ancak, bu avantajın bir bedeli vardır: ekstra sunucu kaynak tüketimi.

Yardımcı okumalar:


24
TEKRARLANABİLİR OKUMA için yukarıda bir hata olduğunu düşünüyorum: Mevcut satırların silinemediğini veya değiştirilemeyeceğini söylüyorsunuz, ancak tekrarlanabilir okuma sadece gerçek verileri değil bir "anlık görüntüyü" okuduğundan silinebilir veya değiştirilebileceğini düşünüyorum. Dev.mysql.com/doc/refman/5.0/en/… dokümanlarından : "Aynı işlemdeki tüm tutarlı okumalar, ilk okuma tarafından oluşturulan anlık görüntüyü okur."
Derek Litz

2
@Derek Litz Şunu söylüyorum: Veriler üçüncü bir taraftan değiştirilebilir, işlem yapılırken, okumalar hala değişiklik yapılmamış gibi 'eski' orijinal verileri görecektir yerleştirin (anlık görüntü).
Programcı

5
@Mısır sapları. Evet, Phantom okumaları silme işlemlerinden (veya eklerden) oluşabilir. Evet, tekrarlanabilir okuma izolasyonunda fantom okumaları meydana gelebilir (yalnızca insertlerden). Hayır, silme işlemlerinden yapılan Phantom okumaları tekrarlanabilir okuma yalıtımında gerçekleşemez. Dene. Söylediklerim, alıntıladığınız belgelerle çelişmiyor.
AndyBrown

4
@Cornstalks NP. Sadece bundan bahsettim çünkü kendimden% 100 emin değildim ve kimin haklı olduğundan emin olmak için derin dalış yapmak zorunda kaldım! Ve gelecekteki okuyucuların yanıltıcı olmasını istemedim. Yorumlarınızı saklıyoruz, muhtemelen önerildiği gibi tutmak en iyisidir. Eminim bu ince detay seviyesiyle ilgilenen herkes tüm yorumları okumak için yeterince özel olacaktır!
AndyBrown

12
Yorumlarınızı silmediğiniz için teşekkürler. Tartışma daha fazla noktayı birleştirmeye yardımcı olur.
Josh

68

Tekrarlanabilir Okuma

Veritabanının durumu, işlemin başlangıcından itibaren korunur. Session1 içinde bir değer alırsanız, session2 içinde bu değeri güncellerseniz, session1 içinde tekrar almak aynı sonuçları döndürür. Okumalar tekrarlanabilir.

session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron

session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;

session1> SELECT firstname FROM names WHERE id = 7;
Aaron

Okundu Gönderildi

Bir işlem bağlamında, her zaman en son taahhüt edilen değeri alırsınız. Session1 içinde bir değer alırsanız, session2 içinde günceller ve sonra session1again içinde alırsanız, session2'de değiştirildiği şekliyle değeri alırsınız. Son kaydedilen satırı okur.

session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron

session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;

session1> SELECT firstname FROM names WHERE id = 7;
Bob

Mantıklı?


SQL Server 2008'de "yalıtım düzeyi tekrarlanabilir okuma ayarla" ile Tekrarlanabilir Okuma'yı denedim. İki sql sorgu penceresi oluşturuldu. Ama işe yaramadı. Neden?
Aditya Bokade

1
İkinci seans1 neden hala Aaron'u okuyor? Session2'nin işlemi tamamlanmadı ve tamamlanmadı mı? Bunu eski biliyorum, ama belki birisi ışık tutabilir.
Sonny Childs

9
Bence Tekrarlanabilir Okuma ilk oturumu tamamlayana kadar ikinci oturumu engelleyecektir. Yani örnek yanlış.
Nighon

4
Tekrarlanabilir Okuma durumunda, oturum 1 satırı okuduğunda, herhangi bir Özel kilidin (oturum 2'ye) güncellenmesine izin vermeyecek paylaşılan bir kilit koyar, bu nedenle veriler güncellenemez.
Taher

SQL Server ve MySQL, iki işlem arasındaki paylaşılan satırların güncellenmesi söz konusu olduğunda farklı davranıyor
user2488286

23

Basitçe bu konuya okuma ve anlama göre cevap ve @ remus-rusanu cevap bu basit senaryoya dayanmaktadır:

İki işlem A ve B vardır. İşlem B Tablo X'u okuyor İşlem A tablo X'a yazıyor İşlem B tekrar Tablo X'u okuyor.

  • ReadUncommitted : İşlem B, işlem A'dan kaydedilmemiş verileri okuyabilir ve B yazımına göre farklı satırlar görebilir. Hiç kilit yok
  • ReadComided : Proses B SADECE A prosesindeki taahhütlü verileri okuyabilir ve yalnızca COMMITTED B yazısına dayalı farklı satırlar görebilir. Basit Kilit diyebilir miyiz?
  • RepeatableRead : İşlem B, İşlem A ne yaparsa yapsın aynı verileri (satırları) okuyacaktır. Ancak A işlemi diğer satırları değiştirebilir. Satırlar Düzeyi Bloğu
  • Serialisable : İşlem B, önceki satırlarla aynı satırları okuyacaktır ve İşlem A, tabloda okuma veya yazma yapamaz. Masa Seviyesi Blok
  • Anlık görüntü : her işlemin kendi kopyası vardır ve üzerinde çalışırlar. Her birinin kendi görüşü var

15

Eski bir soru zaten kabul edilmiş bir cevabı var, ancak SQL Server'da kilitleme davranışını nasıl değiştirdikleri açısından bu iki yalıtım düzeyini düşünmeyi seviyorum. Bu benim gibi kilitlenmeleri ayıklayanlar için yararlı olabilir.

TAAHHÜT OKUYUN (varsayılan)

Paylaşılan kilitler SELECT içine alınır ve SELECT deyimi tamamlandığında serbest bırakılır . Sistem, taahhüt edilmemiş verilerin kirli bir şekilde okunmamasını garanti eder. Diğer işlemler, SELECT'iniz tamamlandıktan sonra ve işleminiz tamamlanmadan önce alttaki satırları değiştirebilir.

TEKRARLANABİLİR OKUYUN

Paylaşılan kilitler SELECT içine alınır ve yalnızca işlem tamamlandıktan sonra serbest bırakılır . Sistem, işlem sırasında okuduğunuz değerlerin değişmeyeceğini garanti eder (çünkü işlem bitene kadar kilitli kalırlar).


13

Bu şüphe basit şemalarla açıklanmaya çalışılıyor.

Okunan Kararlılık: Burada bu izolasyon seviyesinde, İşlem T1, İşlem T2 tarafından taahhüt edilen X'in güncellenmiş değerini okuyacaktır.

Okundu Gönderildi

Tekrarlanabilir Okuma: Bu izolasyon seviyesinde, İşlem T1, İşlem T2 tarafından yapılan değişiklikleri dikkate almayacaktır.

resim açıklamasını buraya girin


1

Sanırım bu resim de yararlı olabilir, izolasyon seviyeleri arasındaki farkları hızlı bir şekilde hatırlamak istediğimde bana bir referans olarak yardımcı oluyor ( youtube'daki kudvenkat sayesinde )

resim açıklamasını buraya girin


0

Tekrarlanabilir okumadaki tekrarlanabilenlerin bir tuple ile ilgili olduğunu ancak tüm tabloya göre olmadığını lütfen unutmayın . ANSC izolasyon seviyelerinde, fantom okuma anomalisi meydana gelebilir, bu da iki tabloyu farklı geri dönüş farklı sonuç kümeleri döndürebildiği yerde aynı tabloyu okumak anlamına gelir. Kelimenin tam anlamıyla, tekrarlanamaz .


-1

Kabul edilen ilk çözüm hakkındaki gözlemim.

RR altında (varsayılan mysql) - Bir tx açıksa ve bir SELECT tetiklenirse, başka bir tx, önceki tx tamamlanana kadar önceki READ sonuç kümesine ait herhangi bir satırı SİLEMEZ (aslında yeni tx'teki delete deyimi askıda kalır) ancak sonraki tx sorunsuz bir şekilde tablodaki tüm satırları silebilir . Btw, önceki tx'deki bir sonraki OKU işleninceye kadar eski verileri görmeye devam edecek.


2
Yanıtlayıcının bildirim alması için yorumlar bölümüne koymak isteyebilirsiniz. Bu şekilde gözlemlerinize yanıt verebilir ve gerekirse düzeltmeler yapabilir.
RBT
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.