DEFINITIONS

Definitions More Info.
Definition ID541
TitleSQL
CategoryNOTES
DefinitionTransaction Isolation Level-seviyesi
Definition Descriptionhttp://www.yazilimdevi.com/Makaleler-630-sql-server-transaction-isolation-levels.aspx Transaction Isolation Level nedir? ISOLATİON LEVEL || DİRTY READ || NON-REPEATABLE READ || PHANTOM READ UNCOMMİTTED || Var || Var || Var READ COMMİTTED || Yok || Var || Var REPEATABLE READ || Yok || Yok || Var SERİALİZABLE || Yok || Yok || Yok Bunlara ek olarak iki seviye de Sql Server kendisi destekliyor. READ COMMİTTED SNAPSHOT ISOLATİON SNAPSHOT TRANSACTİON ISOLATİON Aslına bakarsanız açıklama isminde gizli. Yapılan bir transaction ın diğer transactionlara karşı ne kadar izole edilmesi istendiğini belirtmektir. Örneğin bir transaction başlattınız ve transaction ı sonlandırmadan beklettiniz. Aşağıdaki örnekte olduğu gibi, begin tran myTran update Customers set Country='Türkiye' where ContactName='ENGIN DEMIROG' başka bir yerden de bu kaydı sorgulayan ikinci bir sorgu yazdınız. (Eğer kendi makinanızda deneyecekseniz, İki ayrı Sql Server Management Studio açınız.) select * from Customers where ContactName='ENGIN DEMIROG' Şimdi ikinci sorguda ne olacak? İşte Transaction Isolation Level da tam olarak buna cevap verir. İkinci sorguya vereceğim cevap ne olsun? -------------------------------------- SQL Server Transaction Isolation Levels: Sql Server American National Standards Institute (ANSI) nin belirlemiş olduğu 4 seviyedeki Transaction Isolation seviyelerini destekler. 1- Read Uncommitted (Level 0) 2- Read Committed (Level 1) 3- Repeatable Read (Level 2) 4- Serializable (Level 3) Bunlara ek olarak iki seviye de Sql Server kendisi destekliyor. 5- Read Committed Snapshot Isolation 6- Snapshot Transaction Isolation Izolasyon Seviyeleri Nasıl Set Edilir? T-SQL: Izolasyon seviyelerini set etmek için client tarafında aşağıdaki gibi sorgu çalıştırmak gerekir. SET TRANSACTION ISOLATION LEVEL READ COMMITTED --veya başka bir seviye Ado.Net: İlgili Connection Sınıfının IsolationLevel özelliğini ilgili seviye olarak göstermek gerekir. 1- READ UNCOMMİTTED ISOLATİON LEVEL: Bu izolasyon türü en alt seviye izolasyonun yapıldığı türdür. Örnek: 1.Session begin tran myTran update Customers set Country='Türkiye' where ContactName='ENGIN DEMIROG' 2.Session SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED select * from Customers where ContactName='ENGIN DEMIROG' Transaction ile modifikasyona uğrayan veri başka transactionlar tarafından değişikliğe uğradığı şekliyle görülebilir. Doğal olarak burada bir takım sorunlar ortaya çıkabilir. Ya ilk Session Rollback edilirse? İşte burada Dirty Read yani Kirli Okuma söz konusudur. Çünkü verinin akıbeti belli değildir. Yan Etkileri: Dirty-reads Lost Updates Phantom reads Non-repeatable reads Avantajı: Yüksek Concurency 2- READ COMMİTTED ISOLATİON LEVEL: Sql Server’ın Default Seviyesi budur. Transaction içerisinde modifikasyona uğrayan veri diğer tüm transactionlara kapatılır. Yani erişilemez. Sorgunuz eğer transaction içerisinde kalmış kayıtla ilgili işlem yapmaya çalışırsa beklemekten başka çareniz yok. Eğer daha önce Oracle ile ilgileniyorduysanız bu duruma şaşırmış olabilirsiniz. Çünkü Sql Server Oracle’ın aksine “Auto Commit” özelliğe sahiptir. Bu da transaction kültürünün daha farklı olmasına neden olmuştur. Ama ben size ikisinin de artıları ve eksileri olduğunu söyleyebilirim. İsteyen varsa tartışabiliriz :) 1.Session begin tran myTran update Customers set Country='Türkiye' where ContactName='ENGIN DEMIROG' 2.Session SET TRANSACTION ISOLATION LEVEL READ COMMITTED select*from Customers where ContactName='ENGIN DEMIROG' Sonuç: Yan Etkileri: Lost Updates, Daha Düşük Concurency Avantajı: Read Uncommitted a göre Dirty Readler ortadan kalkar. 3- REPEATABLE READ ISOLATİON LEVEL Düşünün ki bir transaction içerisinde bir tablo satırını okudunuz ve bu satırda bakiye kolonu değeri 100 Lira olsun.Henüz transaction devam ediyor ama siz ekstra bir işlem yapıp tekrardan okuyacaksınız ama öncesinde başkası bakiye kolonunu 50 Liraya çekti. İşte sizin ikinci okumanızda ilk okumadan farklı olarak 50 değeri gelecek. Bir üst seviyedeki bu izolasyon seviyesinde amaç aynı transaction içerisinde aynı okuma sonuçlarını almaktır. Bir transaction da modifiye edilmiş fakat commit edilmemiş veri diğer transactionlar tarafından okunamaz. Ama asıl amacı bir transaction da okunmuş ama henüz commit edilmemiş verinin diğer transactionlar tarafından güncellenememesini sağlamaktır. 1.Session SET TRANSACTION ISOLATION LEVEL REPEATABLE READ begin tran select * from Customers where ContactName='ENGIN DEMIROG' 2.Session update Customers set Country='Türkiye' where ContactName='ENGIN DEMIROG' Sonuç: Avantajı: Dirty Reads Lost Updates Non-Repeatable Reads Dezavantajı: Phantom Reads,Daha düşük Concurency 4- SERİALİZABLE READ ISOLATİON En üst seviyedeki izolasyon seviyesidir. Izolasyon seviyelerinin yan etkileri ortadan kalkmış olur ama concurency düşük oluyor. Repeatable Read Isolation’a ek olarak bu seviyede“Range Lock” mevcuttur. Düşünün ki bir transaction içerisinde ‘Engin Demiroğ’ isimli müşteri için Update yapıyorsunuz. Yani şartınız “Where ContactName=’Engin Demiroğ’” şeklinde olacaktır. Eğer izolasyon seviyeniz ‘Serializable Read Isolation’ ise artık bu tabloya ‘Engin Demiroğ’ isimli başka bir müşteri eklenemeyecektir. Kısacası Phantom Read sorunu da ortadan kalkmış olur. Verilerimiz çok güvende ama çok kısıtlandığımızı da unutmayalım 1.Session SET TRANSACTION ISOLATION LEVEL SERIALIZABLE begin tran myTran update Customers set Country='Türkiye' where ContactName='ENGIN DEMIROG' 2.Session insert into Customers(CustomerID,ContactName,CompanyName) values('ENGIN','ENGIN DEMIROG','İnfopark Ankara') Avantajı: Tüm transaction yan etkileri ortadan kalkar. Dezavantajı: Concurrency çok düşük olur. 5- READ COMMİTTED SNAPSHOT ISOLATİON Bu izolasyon seviyesinde ReadCommitted den dolayı oluşan Transaction içerisinde kalmış update kayıtlarına erişememe sorunu ortadan kalkar. Kısacası modifiye edilmek istenen veri üzerindeki “Shared Lock” devreden çıkar. Oracle da bu mantıkla çalışır. Transaction içerisinde kalmış ve henüz commit edilmemiş kayıtların tempdb veritabanında snapshotları oluşturulur. Böylece diğer sessionların commit edilmemiş veri üzerinde okuyabilme imkanı sağlanır. Kullanılabilmesi için database seviyesinde READ_COMMITTED_SNAPSHOT parametresinin “on” konumunda olması gerekir. Default “Off” dur. Aşağıda ise oturum bazlı kullanımını görüyoruz. ALTER DATABASE northwind SET READ_COMMITTED_SNAPSHOT ON 1.Session begin tran update Customers set ContactName='YazilimDevi.Com' where ContactName='ENGIN DEMIROG' 2.Session select * from Customers where ContactName='ENGIN DEMIROG' 6- SNAPSHOT TRANSACTİON ISOLATİON Bu izolasyon seviyesinde ReadCommitted den dolayı oluşan Transaction içerisinde kalmış update kayıtlarına erişememe sorunu ortadan kalkar. Oracle da bu mantıkla çalışır. Transaction içerisinde kalmış ve henüz commit edilmemiş kayıtların tempdb veritabanında snapshotları oluşturulur. Böylece diğer sessionların commit edilmemiş veri üzerinde okuyabilme imkanı sağlanır. Read Committed Snapshot Isolationdan farkı ise bu seviyede yapılan konfigurasyonun transaction bazlı olmasıdır. Kullanılabilmesi için database seviyesinde Snapshot izolasyonunun “on” konumunda olması gerekir. Default “Off” dur. Aşağıda ise transaction bazlı kullanımını görüyoruz. 1.Session ALTER DATABASE Northwind SET ALLOW_SNAPSHOT_ISOLATION ON begin tran update Customers set ContactName='YazilimDevi.Com' where ContactName='ENGIN DEMIROG' 2.Session SET TRANSACTION ISOLATION LEVEL SNAPSHOT select * from Customers where ContactName='ENGIN DEMIROG'
RecordBycunay
Record Date25-06-2014 22:50:16
Düzenle
Kopyala
Sil