Brb Tea'nin dediği gibi, veritabanı uygulamasına ve kullandıkları algoritmaya bağlıdır: MVCC veya İki Fazlı Kilitleme.
CUBRID (açık kaynak RDBMS) , bu iki algoritmanın fikrini açıklar :
- İki fazlı kilitleme (2PL)
İlki, T2 işlemi A kaydını değiştirmeye çalıştığında, T1 işleminin A kaydını zaten değiştirdiğini bilir ve T1 işleminin tamamlanmasını bekler çünkü T2 işlemi T1 işleminin tamamlanıp tamamlanmayacağını bilemez. geri. Bu yönteme İki fazlı kilitleme (2PL) denir.
- Çok sürümlü eşzamanlılık denetimi (MVCC)
Diğeri, T1 ve T2 işlemlerinin her birinin kendi değiştirilmiş versiyonlarına sahip olmasına izin vermektir. T1 işlemi A kaydını 1'den 2'ye değiştirmiş olsa bile, T1 işlemi orijinal değeri 1'i olduğu gibi bırakır ve A kaydının T1 işlem versiyonunun 2 olduğunu yazar. Ardından, aşağıdaki T2 işlemi A kaydını değiştirir 1'den 3'e, 2'den 4'e değil ve A kaydının T2 işlem sürümünün 3 olduğunu yazıyor.
T1 işlemi geri alındığında, T1 işlem sürümü olan 2'nin A kaydına uygulanmaması önemli değildir. Bundan sonra, T2 işlemi taahhüt edilirse, 3, T2 işlem versiyonu, A kaydına uygulanacaktır. T1 işlemi T2 işleminden önce yapılırsa, A kaydı 2'ye ve ardından T2 işleminin gerçekleştirilmesi sırasında 3'e değiştirilir. Nihai veritabanı durumu, diğer işlemler üzerinde herhangi bir etki olmaksızın, her bir işlemi bağımsız olarak yürütme durumuyla aynıdır. Bu nedenle ACID özelliğini karşılar. Bu yönteme Çoklu sürüm eşzamanlılık denetimi (MVCC) denir.
MVCC, bellekte artan ek yük (çünkü aynı verilerin farklı sürümlerini tutması gerektiğinden) ve hesaplama (REPETEABLE_READ düzeyinde) pahasına eşzamanlı değişikliklere izin verir, bu nedenle Hiberate gibi verilerin sürümlerini kontrol etmelidir. Optimistick Locking ile yapar ).
2PL İşlem izolasyon seviyeleri aşağıdakileri kontrol eder :
Veriler okunduğunda kilitlerin alınıp alınmadığı ve ne tür kilitlerin talep edildiği.
Okuma kilitlerinin ne kadar süreyle tutulacağı.
Başka bir işlem tarafından değiştirilen satırları referans alan bir okuma işleminin olup olmadığı:
Sıradaki özel kilit serbest kalana kadar engelleyin.
İfade veya işlem başladığında var olan satırın kaydedilmiş sürümünü alın.
Taahhüt edilmeyen veri değişikliğini okuyun.
Bir işlem yalıtım düzeyinin seçilmesi, veri değişikliklerini korumak için edinilen kilitleri etkilemez. Bir işlem her zaman değiştirdiği herhangi bir veriye özel bir kilit alır ve o işlem için ayarlanan izolasyon düzeyine bakılmaksızın işlem tamamlanana kadar bu kilidi tutar. Okuma işlemleri için, işlem izolasyon seviyeleri öncelikle diğer işlemler tarafından yapılan değişikliklerin etkilerinden koruma seviyesini tanımlar.
Daha düşük bir izolasyon düzeyi, birçok kullanıcının aynı anda verilere erişme yeteneğini artırır, ancak kullanıcıların karşılaşabileceği kirli okumalar veya kayıp güncellemeler gibi eşzamanlılık etkilerinin sayısını artırır .
SQL Server'da kilitler ve izolasyon seviyeleri arasındaki ilişkinin somut örnekleri ( READ_COMMITTED_SNAPSHOT = ON ile READ_COMMITED dışında 2PL kullanın)
READ_UNCOMMITED: diğer işlemlerin mevcut işlem tarafından okunan verileri değiştirmesini önlemek için paylaşımlı kilitler yayınlamayın. READ UNCOMMITTED işlemleri, geçerli işlemin değiştirilmiş ancak başka işlemler tarafından taahhüt edilmemiş satırları okumasını engelleyen özel kilitlerle de engellenmez. [...]
READ_COMMITED:
- READ_COMMITTED_SNAPSHOT seçeneği KAPALI olarak ayarlanmışsa (varsayılan): geçerli işlem bir okuma işlemi yürütürken diğer işlemlerin satırları değiştirmesini önlemek için paylaşılan kilitleri kullanır. Paylaşılan kilitler ayrıca, diğer işlem tamamlanana kadar ifadenin diğer işlemler tarafından değiştirilen satırları okumasını engeller. [...] Satır kilitleri, sonraki satır işlenmeden önce kaldırılır. [...]
- READ_COMMITTED_SNAPSHOT, AÇIK olarak ayarlanmışsa, Veritabanı Motoru, her bir ifadeyi, ifadenin başlangıcında var olan verilerin işlem açısından tutarlı bir anlık görüntüsüyle sunmak için satır sürümlemesini kullanır. Verileri diğer işlemlerle güncellemelerden korumak için kilitler kullanılmaz.
REPETEABLE_READ: Paylaşılan kilitler, işlemdeki her bir ifade tarafından okunan tüm verilere yerleştirilir ve işlem tamamlanana kadar tutulur.
SERİLEŞTİRİLEBİLİR: Aralık kilitleri, bir işlemde yürütülen her bir ifadenin arama koşullarıyla eşleşen anahtar değerleri aralığına yerleştirilir. [...] Aralık kilitleri işlem tamamlanana kadar tutulur.