Bugün esas olarak MySQL işlem izolasyon seviyesinin uygulama prensibini paylaşıyorum.Sadece InnoDB işlemleri desteklediğinden, buradaki işlem izolasyon seviyesi InnoDB altındaki işlem izolasyon seviyesini ifade ediyor.
Yukarıdakiler, SQL-92 standardında tanımlanan dört izolasyon seviyesidir. MySQL'de varsayılan izolasyon seviyesi TEKRARLANABİLİR-OKUNUR (tekrarlanabilir okuma) ve fantom okuma problemini çözer.
Not: Tekrarlanamayan okumanın odak noktası Güncelleme ve silme, fantom okumanın odağı ise eklemede yatmaktadır.
MVCC'nin tam adı, çok sürümlü eşzamanlılık kontrolüdür. MVCC, InnoDB'nin işlem izolasyon seviyesi altında tutarlı okuma işlemlerini garanti eder.
Basitçe ifade etmek gerekirse, başka bir işlem tarafından güncellenen bazı satırları sorgulamaktır ve güncellenmeden önce değerlerini görebilirsiniz. Bu, eşzamanlılığı iyileştirmek için kullanılan güçlü bir tekniktir, böylece sorguların kilidi açmak için başka bir işlem beklemesi gerekmez.
Aşağıda gösterildiği gibi:
MVCC, her satıra üç alan ekleyecektir, yani: DB-TRX-ID, DB-ROLL-PTR, DB-ROW-ID
Eklemeler ve silmeler
InnoDB'de, MVCC'yi uygulamak için her satıra iki gizli alan ekleyin, biri veri satırının oluşturulma zamanını, diğeri satırın sona erme süresini kaydetmek için kullanılır.
Fiili işlemde, saklanan zaman değil, işlem sürüm numarasıdır Yeni bir işlemin her açılışında işlem sürüm numarası artacaktır. Bu nedenle, sürüm numarasını ekleme, silme, değiştirme ve kontrol etmenin etkisi aşağıdaki gibidir:
seçin: Oluşturulan sürümün geçerli işlem sürüm numarasından küçük veya ona eşit olduğu ve silme sürümünün boş veya geçerli işlem sürümünden büyük olduğu kayıtları okuyun. Bu, kayıtların okumadan önce var olmasını sağlar ekle: Mevcut işlemin sürüm numarasını satırın oluşturma sürüm numarasına kaydedin Güncelleme Yeni bir satır ekleyin ve mevcut işlem sürüm numarasını yeni satırın oluşturma sürüm numarası olarak kullanın ve orijinal kayıt satırının silinen sürüm numarasını mevcut işlem sürüm numarası olarak ayarlayın sil Geçerli işlem sürüm numarasını, satırın silme sürüm numarasına kaydedinAnlık görüntü okuma ve mevcut okuma
Sıradan seçim anlık görüntü okunur, güncelleme, silme, ekleme, seçme ... LOCK SHARE MODE'da, SELECT ... for update geçerli okunur
Önce aşağıdaki resme bakın:
1. Okumayı kilitle
Bir işlemde, standart SELECT ifadesi kilitlenmez, ancak iki istisna vardır.
SEÇ ... PAYLAŞIM MODUNDA KİLİTLE: kayıt için paylaşılan bir kilit olduğunu varsayın, böylece diğer işlem işlevleri geçerli işlem tamamlanana kadar değiştirilemez
GÜNCELLEME İÇİN SEÇİN: dizin kaydını kilitleyin, bu durum GÜNCELLEME'nin kilit durumuyla aynıdır
2. Tutarlı kilitlenmeyen okuma
Tutarlı okuma, InnoDB, belirli bir zamanda sorgu veritabanının anlık görüntüsünü sağlamak için birden çok sürüm kullanır.
İzolasyon seviyesi TEKRARLANABİLİR OKUMA ise, aynı işlemdeki tüm tutarlı okumalar, işlemdeki ilk okumada okunan anlık görüntüyü okur; OKUMA GERÇEKLEŞTİRİLDİ ise, bir işlemdeki her tutarlı okuma Anlık görüntünün kendi yenilenmiş sürümünü okuyun.
Tutarlı okuma (tutarlı okuma), READ COMMITTED ve REPEATABLE READ yalıtım düzeyleri altındaki sıradan SELECT ifadeleri için varsayılan moddur. Tutarlı okuma, erişimi kilitlediği tabloya herhangi bir kilit biçimi eklemez, böylece diğer işlemler bunları eşzamanlı olarak değiştirebilir
Bir dizin aşağıdaki değerleri içeriyorsa: 10, 11, 13, 20. Bu dizinin sonraki tuş kilidi aşağıdaki aralığı kapsayacaktır:
(negatif sonsuz, 10> (10, 11> (11, 13> (13, 20> (20, pozitif sonsuz)Varsayılan izolasyon seviyesinde, sıradan SELECT, kilitlemeden tutarlı okuma kullanır. Kilitli okumalar için, GÜNCELLEME ve SİLME, kilitler gereklidir.Hangi kilitlerin eklendiğine gelince, farklı durumlar vardır.
Benzersiz bir dizin için benzersiz bir arama koşulu kullanılıyorsa, yalnızca karşılık gelen dizin kaydının kilitlenmesi gerekir; benzersiz dizin arama koşulu olarak kullanılmazsa veya dizin aralığı taraması kullanılırsa, boşluk kilidi veya sonraki tuş kullanılır. Diğer oturumların bu aralıktaki boşluğa veri eklemesini engellemek için kilitleyin
Tutarlı kilitlenmeyen okumalar elde etmek için MVCC'nin kullanılması, aynı işlemde birden çok kez okunan aynı verilerin aynı sonucu döndürmesini sağlar ve bu da tekrarlanamayan okumalar sorununu çözer.
Boşluk Kilitleri ve Sonraki tuşunu kullanmak, diğer işlemlerin kilitli aralıkta veri eklemesini engelleyebilir ve hayali okuma sorununu çözebilir.
Kısacası, MySQL'in varsayılan izolasyon seviyesinin uygulanması, hassas, tutarlı okumalar ve kilitler olması için MVCC ve kilitlere dayanır.