Transaction & Isolation

Dark-Man

Kıdemli Üye
5 Ocak 2013
4,430
9
I Don't Know
[FONT=&quot]Begin Transaction : [/FONT][FONT=&quot]Transaction işleminin başladığını belirtir. [/FONT]
[FONT=&quot]Commit Transaction : [/FONT][FONT=&quot]Begin Transaction ile başlattığımız transaction işlemimizin sonuna işaret koyarak, bunların veritabanına yazılmasını sağlar. [/FONT]
[FONT=&quot]Rollback : [/FONT][FONT=&quot]İşlemde hata oluştuğunda rollback çalışır ve yapılan bütün işlemler geriye alınır. Yani veritabanına yansıtılmaz. [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Veritabanı oluşturma (CREATE DATABASE), veritabanı değiştirme (ALTER DATABASE), veritabanı silme (DROP DATABASE) gibi işlemleri transaction ‘nın içinde belirtemezsiniz. Farklı çeşitlerde transaction yöntemleri vardır. Bunlardan ilki Explicit transaction’dır. Begin Tran ile başlattığımız, gereken yerde rollback komutu ile yaptığımız işlemleri geri aldığımız ve Commit Tran ile işlemimizi sonlandırdığımız yöntem Explicit Transaction yöntemidir. Şimdiden bununla ilgili bir örnek yapalım. Örneğimiz yukarıda belirttiğimiz gibi bir banka veya para transferi yapan bir yerin veritabanı olduğunu varsayalım. KisiID, ad, soyad ve bakiye bilgilerinin tutulduğu bir tablo oluşturalım ve ismine ABank diyelim. Bu tablomuza bakiyesinde 35000 ytl olan Murat KOCA isimli bir müşteri kaydettik. Aynı kolonlardan oluşan bir tablo daha oluşturduk ve içine birkaç kişinin bilgisini girdik.

image001.jpg


[/FONT]
[FONT=&quot]ABank tablomuzdaki Murat KOCA isimli şahısın hesabından 1000 ytl’ yi BBank tablomuzdaki Korhan KOCA isimli şahsın hesabına aktaralım. [/FONT]

[FONT=&quot]
[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]update Abank set [/FONT]
[FONT=&quot]bakiye=bakiye-1000 [/FONT]
[FONT=&quot]where kisiID=1 [/FONT]
[FONT=&quot]update Bbank set [/FONT]
[FONT=&quot]bakiye=bakiye+1000 [/FONT]
[FONT=&quot]where kisiID=2 [/FONT]
[FONT=&quot]İşlemimizi gerçekleştirdik. Peki ya ilk update işlemimizden sonra herhangi bir nedenden dolayı ikinci update işlemimizi yapamadığımızı düşünürsek? Murat KOCA’ nın hesabındaki 1000 ytl eksildi ama nereye gittiği belli değil. Veya ikinci sordumuzdaki where kriterinde kisiID’yi 5 olarak gösterelim. İlk işlemden para eksilecek ama BBank tablomuzda kisiID’si 5 olan bir kişi bulunmadığından ikici sorgumuz hata verecektir. İşte birbirleri ile ilişkili tablolarda bu tip hataları ortadan kaldırmak için Transaction’ı kullanırız. Şimdide yukardaki işlemi transaction ifadeleri arasında belirtelim. [/FONT]
[FONT=&quot]begin tran [/FONT]
[FONT=&quot]update Abank set [/FONT]
[FONT=&quot]bakiye=bakiye-1000 [/FONT]
[FONT=&quot]where kisiID=1 [/FONT]
[FONT=&quot]if(select count(*) from BBank [/FONT]
[FONT=&quot]where kisiID=5)=0 [/FONT]
[FONT=&quot]begin [/FONT]
[FONT=&quot]update Bbank set [/FONT]
[FONT=&quot]bakiye=bakiye+1000 [/FONT]
[FONT=&quot]where kisiID=5 [/FONT]
[FONT=&quot]commit tran [/FONT]
[FONT=&quot]end else begin [/FONT]
[FONT=&quot]rollback tran [/FONT]
[FONT=&quot]end [/FONT]

[FONT=&quot]
[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Yukarıdaki işlemde ABank tablosunda kisiID=1 olan şahısın hesabından 1000 ytl eksilttik ve BBank ‘ta kisiID’ si 5 olan kişinin hesabına aktarmak istedik. Bunun için ilk önce BBank tablosunda kisiID’si 5 olan bir kişinin olup olmadığının kontrolunu yaptık. Eğer böyle bir kişi varsa mevcut bakiyesinin üzerine 1000 ytl daha ilave ettik. Eğer yoksa rollback ile yapılan işlemleri geri aldık. Bizim tablomuzda kisiID’si 5 olan bir şahıs olmadığından bu işlemi gerçekleştirdikten sonra son duruma bakacak olursak bir değişiklik olmayacaktır.[/FONT][FONT=&quot][/FONT]

image002.jpg


[FONT=&quot]Yukarıdaki transaction işleminde kisiID’si 5 olan yeri 2 olarak değiştirip tekrar çalıştırdığımızda, son durum bakiyeleri değişmiş olacaktır. [/FONT]

[FONT=&quot]
[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]begin tran [/FONT]
[FONT=&quot]update Abank set [/FONT]
[FONT=&quot]bakiye=bakiye-1000 [/FONT]
[FONT=&quot]where kisiID=1 [/FONT]
[FONT=&quot]if(select count(*) from BBank [/FONT]
[FONT=&quot]where kisiID=2)=1 [/FONT]
[FONT=&quot]begin [/FONT]
[FONT=&quot]update Bbank set [/FONT]
[FONT=&quot]bakiye=bakiye+1000 [/FONT]
[FONT=&quot]where kisiID=2 [/FONT]
[FONT=&quot]commit tran [/FONT]
[FONT=&quot]end else begin [/FONT]
[FONT=&quot]rollback tran [/FONT]
[FONT=&quot]end

image003.jpg


[/FONT]
[FONT=&quot]Isolation : [/FONT][FONT=&quot][/FONT]
[FONT=&quot]İki veya daha fazla kullanıcı aynı anda sorgu çekmeye kalktığında, bir kullanıcı update veya insert işlemi gerçekleştirirken commit veya rollback görülene kadar diğer kişi(ler) gerçekleştirmek istedikleri sorgularına cevap alamazlar. Bu bölümde yapacağımız işlemle bir kullanıcı insert, update işlemleri yaparken; diğer kişi(ler) başka bir sorgu yazıp çalıştırabilecek. Bir transaction işlemi gerçekleştirilmeye başlandığında ya commit ile yada rollback ile bitebilir. Isolation’ lar eş zamanlarda çalışan transactionların aynı yerde işlem yapmasını engeller. Sql server’da 4 farklı isolation seviyesi vardır. Bunlardan ilki Read Uncommitted’dır. Bu en düşük isolation seviyesidir ve bir transaction okuma yaparken, diğer transaction’ lara karşı hiç bir kilitleme yapmamasından dolayı diğer transaction işlemleri ile veriler değiştirilebilir. Read committed’ da ise bir okuma işlemi için erişen transaction işini bitirmeden, veriler değiştirilebilir. Ayrıca bu seviye SQL Server 2000 için default değerdir. Bir diğer seviye olan Repeatable Read ‘te ise sadece commit edilmiş verileri okumak ile birlikte, veriler okunurken başka kullanıcının veriler üzerinde herhangi bir değişiklik yapmasını kısıtlar yani izin vermez. En yüksek seviyeye sahip olan Serilizable()’ da ise veri ekleme ve güncelleme işlemleri yapılırken yazdığımız transaction işlemi boyunca verileri diğer transaction işlemleri kullanamaz. İstediğimiz veritabanındaki İsolation’ ların seviyesini belirlemek ve kullanmak aşağıdaki gibidir. Örnek olarak Northwind veritabanımızdaki Employees tablosu kullanılmıştır. [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]set transaction isolation level [/FONT]
[FONT=&quot]Read Committed [/FONT]
[FONT=&quot]select * from employees [/FONT]
[FONT=&quot]set transaction isolation level [/FONT]
[FONT=&quot]read uncommitted [/FONT]
[FONT=&quot]select * from employees [/FONT]
[FONT=&quot]/* uncommitted dediğimiz zaman diğer [/FONT]
[FONT=&quot]tarafta commit görünceye kadar olan [/FONT]
[FONT=&quot]değişiklikleride getirdi */ [/FONT]
[FONT=&quot]Başka bir örnek daha yapalım. Örneğin bir kullanıcı select sorgusu yaparken başka bir kullanıcı update, insert, delete işlemlerini yapamasın. [/FONT]
[FONT=&quot]set transaction isolation level [/FONT]
[FONT=&quot]repeatable read [/FONT]
[FONT=&quot]begin tran [/FONT]
[FONT=&quot]select * from employees [/FONT]
[FONT=&quot]Başka bir kullanıcı update işlemi yapmaya kalktığında yukarıda yazmış olduğumuz kodu yazan kullanıcı commit işlemini yapana kadar işlemi gerçekleşmeyecektir. Repeatable read’te update,delete yapamaz fakat insert işlemi yapabilir.s[/FONT]
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.