08 December 2016

Transaction

Transaction bir işin tamamının yapılması isteniyorsa kullanılır. Bulunduğu durumdan daha küçük parçalara ayrılamayan işleme transaction denir. Transaction SQL server üzerinde her türlü değiştirme ve sorgulama işlemidir. Transaction’u yapacağımız işlerin bütünlük arzetmesi için uyguluyoruz.

SQL Server 2 farklı transaction moduna destek verir.

Explicit Transcation (Harici): Kullanıcı tarafından tanımlanır.

Imlicit Transcation (Dahili): Herhangi bir transaction şekli belirtilmediyse, SQL Server bu modda çalışır.

Transaction’ın Kullanımı:

BEGIN TRAN ifadesiyle başlar. Sonucun başarısız olması halinde COMMIT TRAN ifadesi ile işlemler gerçekleşmiş veya ROLLBACK ifadesi ile işlemler olmamış gibi sonlandırılabilir.

Örnek:

create proc Havale
 (
 @alici nvarchar(50),
 @gonderen nvarchar(50),
 @miktar money
 )
 as
 begin try
 begin tran
 update Musteri set Bakiye+=@miktar where AdSoyad=@alici
 raiserror ('Hata Oluştu',11,0)
 update Musteri set Bakiye-=@miktar where AdSoyad=@gonderen
 commit tran
 end try
begin catch
rollback
 print ('Hata Oluştu')
 end catch
--test code
exec Havale 'Ali','Ahmet',300
--açık transactionların sayısını görmek için
select @@TRANCOUNT

Araştırma konusu:

Ortak Zamanlı Erişim Sorunları

Dirty Page: Bir transaction tarafından değiştirilmiş ama henüz kalıcı hale getirilmemiş bir bilginin başka bir transaction tarafından gerçek kayıtmış gibi okunmasıdır. (Yani bir başkasının değiştirdiği ancak henüz COMMIT etmediği veriyi okumak. COMMIT edilmemiş veri kirlidir ve her zaman ROLLBACK edilme ihtimali vardır.)

Non-Repeatable Read: İkinci bir transaction bir satıra her erişiminde farklı bir değer okuyor, sadece okuma yapmasına rağmen bir türlü sabit bir değere ulaşamıyorsa, tekrarlamasız okuma sorunu ortaya çıkar. (Bir kere okunan satır tekrar okumak istendiğinde o satırın değişmiş olabileceği anlamına gelir.)

Phantom Read: Transaction’lardan biri silme veya ekleme(Insert-Update) işlemeri gerçekleşirken diğer bir transaction bu işlemleri içine alan aralıktaki satırlar üstünde okuma yapıyorsa, ya elde ettiği satırlardan bir kısmı artık yoktur veya elde ettiği satırlar, bazı satırları eksik bulunduruyordur. (Çalıştırılan bir sorgu tekrar çalıştırıldığında bir önceki veriye fazladan satırlar eklenmiş olma durumu.)

Ortak Zamanı Erişim İzolasyon Seviyeleri

Read Uncommitted: En basit izolasyon seviyesidir. Bir transaction okuma yaparken, diğer transaction’lara karşı hiç bir kilitleme yapmadığından, diğer transaction’lar verileri değiştirebilir.

Read Committed: SQL Server’in default seviyesidir. Bir okuma işlemi için erişen transaction işini bitirmeden, veriler değiştirilebilir.

Repeatable Read: Dirty Page ve Non-Repeatable Read okumalara karşı kilitleme mekanizmasının olduğu bir izolasyon seviyesidir.

Serialisible: Veri eklerken, silinirken veya güncellenirken transaction boyunca veriler erişime kapatılır. Hiç bir ortak zamanlılık sorunu meydana gelemez ancak işlemler çok bekler ve deadlock’lar meydana gelebilir.

Transaction İçin İzolasyon Belirlemek

SET TRANSACTION ISOLATION LEVEL izolasyon_seviyesi

Daha fazla bilgi:
http://www.yazgelistir.com/Makaleler/1000001485.ygpx
http://www.verivizyon.com/kitapoku.asp?catid=137