Menu

28 Eylül 2010 Salı

Locking and Concurrency

En zoru, çok kullanıcılı databaselerde database- driven uygulamaların aynı anda erişimin sağlanabilmesi ve aynı zamanda kullanıcıların tutarlı veriler üzerende işlem yapabilmesidir. Locking ve concurency kontrolü işte bu zor olanı gerçeklemektedir.
Lock
Çok kullanıcı tarafından paylaşılan kaynaklara, eş zamanlı erişimi ve aynı zamanda kullanıcının veri bütünlüğü ile tutarlı bir dataya erişmesini sağlayan mekanizmadır. Genel nesne tipleri locklardan etkilenir(tablo ve satırlar, structure ve data ). Oracle datayı datayı satır bazında kilitler. Yani; concurrency kısaca pek cok kullanıcının aynı anda aynı dataya ulaşabilmesi durumu, consistency de her bir kullanıcının kendisinin ya da bir başka kullanıcının transaction ı aynı anda çalışsa bile tutarlı bir data setine sahip olabilmesi şeklinde özetlenebilir…
Isolation Levels
Uygulanma durumlarına göre farklı sonuçlar doğurabilirler.
Dirty Read: Commit edilmemiş data demektir. Oracle dirty datanın okunmasına izin vermez. Başka bir kullanıcı tarafından read yapıldığında en son commit edilmiş hali okunur. constraint, foreign key yok.
Non-repeatable Read: t1 anında bir satırı okuduğumuzda aldığımız veri ile t2 anında okuduğumuz veri aynı olmayabilir. Update görmüş, silinmiş vb olabilir.
Phantom Reads: Transaction A where sözcüğüyle bir select çalıştırdıktan sonra, B Transaction'ı where şartını sağlayan bir insert yaparsa, A aynı sorguyu tekrar çalıştırdığında farklı sonuç alacaktır.
Isolation level, Oracle’ın sql statementları nasıl consistency işlemi yapacağını ve hangi lockun kullanılacağının bilgisidir.
  Read Uncommitted
  Read Committed (Default)
  Non-Repeatable
  Serializable Transactions
  Read-only
Oracle; Read Commited (ki bu default değerdir),  Serializable Transactions , Read-Only Transactionsları desteklemektedir.
Read uncommited: Dirty read yapılmasını sağlar. Oracle buna izin vermez.
Read Commited: Her bir sorgu çalıştırıldığında o ana kadar commit edilmiş data bilgileri okunur. Dirty read yapılmaz.
Serializable Transactions: Read Committeda ek olarak, kendi içinde yaptığı INSERT,UPDATE ve DELETE statementlarına da izin verir.
Read-Only : Read Committed gibidir ama INSERT, UPDATE ve DELETE işlemleri yapılmaz. Sadece commit edilmiş datadır.



Hiçbir selectte bekleme yapılmaz. Readler serbesttir. Write yapan read yapanı beklemez.
Repeateable Read: Oracle transactionun başladığı anı tuttuğu için herhangi bir ana geri dönülebilir. Roll-back etkilidir. Aslında Flashback de budur.


Transaction Level’ın set edilmesi;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION ISOLATION LEVEL READ ONLY;
Session Level’ın set edilmesi;
ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;
ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;
ALTER SESSION SET ISOLATION_LEVEL READ ONLY;
Oracle Lock Duration:
Tüm Lock’lar, transaction deyimleri tarafından elde edilir ve transaction süresince tutulur. Commit ya da rollback yapılana kadar locklar saklı tutulur. Ayrıca, Oracle her savepointten sonra lock bırakır.
Oracle Lock Mode:
  Exclusive Lock Mode: Değiştirme anında kullanılan locktur. Kimse insert yapamaz.
 Share Lock Mode: İki kullanıcı aynı anda bir datayı exclusive lock üzerine koyamaz, değiştirilemez. Read edilebilir.
Oracle Lock Tipleri
  DML locks (data locks)
  DDL locks (dictionary locks)
  Oracle Internal Locks/Latches
  Oracle Distributed Locks
  Oracle Parallel Cache Management Locks
DML Lock (Update, Insert vb..): işlem yapılacak olan satırı ya da satırları kilitler.
DDL Lock (Create , Alter, Drop vb..): nesnelerin yeniden tanımlanmasını engeller.
TX – (Transaction) Locks: Row bazında attribute olarak tutar. Commit ya da rollback yapılana kadar lock kalır. Bir tür kuyruk yapısına sahiptir. Transaction bitene kadar diğer sessionlar bekler. Normal Select işlemlerinde TX kullanılmaz. Değiştirilen ya da select for update yapılan her bir satır tx locku ile kilitlenir.
TM – (DML Enqueue) Locks:Tablo içeriği değiştirilirken, başka kullanıcılar tarafından yapısının değiştirilmemesi (alter, drop uygulanmaması) için kullanılan locktur.
  V$TRANSACTION, her aktif transaction için entry içerir.
  V$SESSION, aktif sessionları gösterir.
  V$LOCK, anlık kilitleri gösterir.
SQL sorgusu ile manual olarak kilitlenebilir. (bütün segment page loglanmaz, row bazındadır.)
SELECT...FOR UPDATE
LOCK TABLE IN EXCLUSIVE MODE
DBMS_LOCK paketi kullanılarak kilit yaratılabilir.
DBMS_LOCK
DeadLock
Kaynağı paylaşma durumu oldugunda karşımıza çıkabilecek durumlardan en basta geleni belki de deadlock hatası alma durumudur. Deadlock aynı kaynağı paylaşan 2 ya da daha fazla transaction ın birbirinin işinin bitmesini beklemesi olarak özetlenebilir.



A anında her 2 transaction da işlemleri gerçekleştirir. T1 anında empno = 1000 olan satırı, T2 anında ise empno = 2000 olan satırı kilitlerve işlemi gerçekleştirir. B anında T1 empno = 2000, T2 de empno = 1000 olan kaydı update etmek için lock mekanizmasını devreye sokar. Ancak bu durumda A anındaki işlemden sonra commit ya da rollback yapılmadıgı için sistem her 2 transaction için lock mekanizmasını o satırlar üzerinden kaldırmamıştır. Bu sebeble B anında T1 ve T2 birbirini beklemeye baslayacaklardır. Oracle deadlock durumunu otomatik olarak fark eder, tespit eden transaction ın tarafında rollback çalıştırır ve bir mesaj ile durum kullanıcıya bildirilir. 


Bahar Gezici

Kaynak : http://www.bahargezici.com/category/Oracle.aspx

Hiç yorum yok:

Yorum Gönder