MVCC Nedir?

MVCC (Multi Version Concurrent Control) bir veri tabanında eş zamanlı olarak okuma ve yazma işlemlerinin sorunsuz yapılabilmesi adına geliştirilen bir modeldir. Bu model eş zamanlı işlemlerin yönetilebilmesi adına işlemlere ait Transaction ID bilgisini kullanmaktadır.

Transaction ID Nedir?

Transaction ID bilgisi veri tabanı işlemi yapılırken, işlemleri kontrol etmek adına veri tabanı yönetim programı tarafından üretilen 32-bit integer bir değerdir. Bilginin 32-bit olarak tutulmasından dolayı 4,294,967,295 farklı değer üretilebilmektedir. Bu değer limitinin aşılması durumunda sistem 0’dan başlayarak yeniden ID üretmeye başlayacaktır, bu durumda mevcut bağlantının gerekli bilgilere erişememesine sebebiyet verecektir.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Postgresql MVCC modeline göre her satır ekleme işlemi sırasında iki farklı bilgi daha kayıt altına alınmaktadır.

Bu iki bilgi şu şekilde isimlendirilir;

  • tmin — Insert Transaction ID bilgisi
  • tmax — Delete Transaction ID bilgisi
Bu bilgiler işleme ve işlem sırasında üretilen ID’nin küçük veya büyük olma durumuna göre anlam kazanırlar.

Örneğin;
  • Eş zamanlı bağlantı kurularak bir satır ekleme işlemi yapılmışsa ve yapılan işlemin Transaction ID’si, görüntülenmek istenen satırın Insert Transaction ID’sinden büyükse eklenen satır diğer bağlantılara görünür olacaktır.

  • Bob ve Alice kullanıcıları eş zamanlı olarak işleme başlarlar. Başlattıkları işleme ait Transaction ID bilgisini txid_current() PostgreSQL fonksiyonu ile öğrenilebilir.

  • Alice’in post tablosuna yapmış olduğu insert işlemi ile beraber Alice’in Transaction ID’si satırın tmin bilgisine atanır.

  • Read Committed izolasyon seviyesinde çalışıldığı düşünüldüğünde; Bob bu değişiklikleri Alice işlemini Commit edene kadar göremez.

  • Alice’in işlemini commit etmesi ile beraber Bob kendi Transaction ID’sinin eklenen satırın tmin bilgisinden büyük olması sebebiyle bu satırı görebilecektir. Aksi durumda Bob’un bu satırları görebilmesi için sistemin izolasyon seviyesinin getirdiği izinler kontrol edilmelidir.

  • . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
    • Eş zamanlı bağlantı kurularak bir satır silme işlemi yapılmışsa ve yapılan işlemin Transaction ID’si, görüntülenmek istenen satırın Delete Transaction ID’sinden küçükse satır görünür olacaktır.

    • Bob ve Alice kullanıcıları eş zamanlı olarak işleme başlarlar. Başlattıkları işleme ait Transaction ID bilgisini txid_current() PostgreSQL fonksiyonu ile öğrenilebilir
    • Bob’un post tablosundan bir satır silmesi ile beraber kendi Transaction ID’si satırın tmax bilgisine atanır.
    • Read Commited izolasyon seviyesine çalışdığı düşünüldüğünde, Bob yaptığı silme işlemini commit edene kadar Alice bu satırı görebilecektir.
    • Bob’un işlemini commit etmesi ile beraber eğer Alice’in Transaction ID’si eklenen satırın tmax değerinden büyükse satır koşulsuz olarak görünmez olacaktır. Aksi durumda bu satır sistemin izolasyon seviyesine göre görünür olacaktır. Çalışma seviyemiz Read Commited olduğu düşünüldüğünde Alice bu bilgileri göremeyecektir.

    VACUUM

    Yukarıda belirtildiği gibi Transaction ID değerlerinin yüksek de olsa bir limiti vardır. Bu sebeple karşılaşabilecek sorunların önüne geçmek adına VACUUM fonksiyonu kullanılabilir. VACUUM çalıştırıldığı zaman gerekli ID bilgilerini karşılaştırarak eski kullanılmayan versiyonları tespit eder ve bu kayıtların doğru bir şekilde silinmesini sağlar. Bu şekilde ID kayıtlarını yenilediği ve hafızada da gereksiz verileri tutmadığı için karşılaşılabilecek hataların önüne geçilmiş olunur

    Kaynaklar

    Comments

    Popular posts from this blog