Pessimistic ve Optimistic Concurrency Control

Bu makalede Pessimistic ve Optimistic Concurrency Control konusunu detaylı bir şekilde ele almış olacağız. Optimistic ve Pessimistic Concurrency Control, veritabanı yönetim sistemlerinde  eşzamanlılık (concurrency) yönetimi için kullanılan iki farklı yaklaşımdır. Her iki yaklaşım da, birden fazla kullanıcının veya işlemin aynı verilere erişmesi ve değiştirmesi durumunda veri tutarlılığını sağlamayı amaçlar. Ancak bu yaklaşımlar, kilit mekanizmaları ve çakışma (conflict) yönetimi açısından farklılık gösterir.

 1. Pessimistic Concurrency Control (Kötümser Eşzamanlılık Kontrolü)
Pessimistic Concurrency Control, işlemlerin verilere erişirken veya değiştirirken çakışma olacağını varsayar. Bu nedenle, işlemler başladığında veriler üzerinde locks alır ve işlem tamamlanana kadar bu kilitleri tutar. Bu yaklaşım, çakışmaları önlemeye odaklanır.
Bir işlem verilere eriştiğinde, veriler üzerinde lock koyar. Diğer işlemler, bu kilitler serbest bırakılana kadar verilere erişemez veya değiştiremez.
Kilitler, işlem tamamlandığında (örneğin, COMMIT veya  ROLLBACK yapıldığında) serbest bırakılır.
Kullanılan Kilit Türleri:
Shared Lock (S): Okuma işlemleri için kullanılır. Birden fazla işlem aynı veriyi okuyabilir, ancak yazma işlemleri engellenir.
Exclusive Lock (X): Yazma işlemleri için kullanılır. Bu kilit alındığında, başka hiçbir işlem veriyi okuyamaz veya yazamaz.
Update Lock (U): Güncelleme işlemleri için kullanılır. Bu kilit, daha sonra Exclusive Lock’a dönüşebilir.

 Avantajları:
 Çakışmalar önlenir, bu nedenle veri tutarlılığı garanti altındadır.
 Uzun süren işlemlerde veri bütünlüğü korunur.

 Dezavantajları:
 Kilitler, diğer işlemlerin beklemesine neden olabilir (blocking).
 Deadlock (kilitlenme) riski vardır.
 Yüksek eşzamanlılık gerektiren sistemlerde performans sorunlarına yol açabilir.

 Örnek Senaryo:

BEGIN TRAN 
UPDATE Sales.SalesOrderDetail SET OrderQty = 10 WHERE SalesOrderID = 43659;

Not: SQL Server’da WITH (UPDLOCK) ifadesi, update kilidi (update lock) almanızı sağlar. Bu kilit, bir veri satırını güncelleme niyetinde olduğunuzu belirtir.

Bu satır üzerinde Update Lock alındı. Bu kilitle bir lock koyar. Üzerinde sadece veriler okunmaktadır. Aşağıdaki ikinci kodda güncelleme işlemi devam ederken select ifadesi row bazında değil genel olarak çekildiği için lock oluşmaktadır.

BEGIN TRAN; 
SELECT * FROM Sales.SalesOrderDetail 

2. Optimistic Concurrency Control (İyimser Eşzamanlılık Kontrolü)
Optimistic Concurrency Control, işlemlerin çakışma olmayacağını varsayar. Bu nedenle, işlemler başladığında veriler üzerinde kilitler alınmaz. Bunun yerine, işlemler verileri değiştirmeye çalıştığında çakışma olup olmadığı kontrol edilir. Eğer çakışma varsa, işlem geri alınır (rollback) ve kullanıcıya bildirilir. Kısacası aynı anda update işlemi gelebilir burada çakışmaları tespit eder çözmektedir. İşlemler verileri okurken herhangi bir kilit almaz. Veriler değiştirilmek istendiğinde, önce verilerin başka bir işlem tarafından değiştirilip değiştirilmediği kontrol edilir. Eğer veriler değiştirilmişse, işlem geri alınır ve kullanıcıya hata bildirilir.  Sürüm kontrolü (Versioning) yapar her kaydın bir sürüm numarası veya zaman damgası (timestamp) vardır. İşlemler, verileri değiştirmeden önce bu sürüm numarasını kontrol eder. İşlemler, verilerin orijinal değerlerini saklar ve değiştirmeden önce bu değerlerin hala geçerli olup olmadığını kontrol eder.

Örnek üzerinden gidecek olursak:

Kullanıcı veriyi okur ve RowVersion değerini alır

BEGIN TRAN;
SELECT OrderQty, RowVersion FROM Sales.SalesOrderDetail WHERE SalesOrderID = 43659;

Kullanıcı, veriyi güncellemeye çalışırken RowVersion kontrol eder

UPDATE Sales.SalesOrderDetail
SET OrderQty = 10
WHERE SalesOrderID = 43659 AND RowVersion = @RowVersion;
COMMIT;

Yukarıdaki kodu açıklamak gerekirse:

  • Bir satırın RowVersion veya timestamp gibi bir kolon değeri kullanılır.
  • Kullanıcı ilk okuma yaptığında, bu değeri alır ve işlem sırasında tekrar kontrol eder.
  • Eğer bu değer değişmemişse, kullanıcı işlemi yapabilir.
  • Eğer değer değişmişse, başka biri veri üzerinde değişiklik yapmış demektir ve kullanıcıya hata mesajı gösterilir.

Kısacası:
 Pessimistic Concurrency Control, veri tutarlılığının kritik olduğu ve çakışmaların sık yaşandığı sistemlerde tercih edilir (örneğin, bankacılık sistemleri).
 Optimistic Concurrency Control, yüksek eşzamanlılık gerektiren ve çakışmaların nadir olduğu sistemlerde tercih edilir (örneğin, web tabanlı uygulamalar).

Her iki yaklaşım da farklı senaryolarda avantajlar ve dezavantajlar sunar. Doğru yaklaşım, uygulamanın gereksinimlerine ve iş yüküne bağlıdır. Bu makalede Pessimistic ve Optimistic Concurrency Control detaylı bir şekilde görmüş olduk. Başka bir makalede görüşmek dileğiyle..

“Allah’ın, göklerde ve yerde bulunan şeyleri hizmetinize verdiğini, nimetlerini gizli ve açık olarak önünüze bolca serdiğini görmez misiniz? İnsanlardan öyleleri vardır ki bir bilgi, bir rehber ve aydınlatıcı bir kitap olmadan Allah hakkında tartışmaya kalkışırlar.”Lokman-20

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir