Spring Framework Transaction Yönetimi

ÖMER FARUK İÇEN
2 min readSep 19, 2018

--

Transaction işlemi veri tabanında gerçekleştirilen bir grup sql işleminin tek bir bütün halinde işleme alınmasıdır.Method içerisindeki işlemlerin her biri başarılı olması durumunda commit edilmesi herhangi birinin başarısız olması ise işlemin tamamının başarısız olarak kabul edilerek rollback yapması olayıdır. Bu işlem bize veri bütünlüğünü sağlar.

Her veri erişim teknolojisi için transaction yönetimi farklılık gösterir. Spring değişik veri erişim yöntemlerini aynı anda kullanmayı sağlayan ortak bir transaction yönetim API sine sahiptir.

Platform Transaction Manager bu soyutlanma alt yapısı ile veri erişim teknolojiniz değişse bile transaction yönetiminizde herhangi bir değişiklik yapmamıza gerek kalmaz.

Spring transaction yönetimi dağıtık sistemleri destekleyen bir yapı sunar (Birden fazla veritabanlarına erişmesi ve bu işlemi tek bir transaction işlemi içerisinde ele alması)

Spring transaction yönetimi için iki yöntem sunar . Programatik ve Deklaratif

Programatik yöntem : Transaction işleminin başlatılıp sonlandırılması ve açık kalan bağlantıların kapatılması kodlarının içinde barındıran bir yöntemdir.

Deklaratif yöntem : Spring altyapısında bazı kurallar çerçevesinde Spring Container tarafından gerçekleştirilir.

@Transactional Anotasyonu sayesinde yapılır

Sınıf yada metod düzeyinde gerçekleştirilir.Sınıf düzeyinde yazmış olduğunuz anatosyon sınıftaki tüm public metodları kapsar.

Servis Metod çağrısı ile Spring Container tarafından yeni bir transaction başlatılır.Metod başarılı olduğunda commit edilir.

@Transactional Annotaion source kodu şu şekilde

Bu annotasyonun bize sundukları :

A. Propagation

Servis metodu çağrıldığı vakit Transaction başlatılıp başlatılmayacağına mevcut transaction varsa bunun devam etmesini yoksa yeni bir transaction oluşturulmasına göre davranış şekillerini belirlemeye yarayan bir enum sınıftır. EJB de de bulunan bu kuralları spring doğrudan benimsemiştir.

7 farklı kural :

1. REQUIRED : Default dur . Aktif bir Transaction yoksa yeni bir transaction açar. Aktif varsa buna katılır.

2.REQUIRES_NEW : Aktif bir transaction işlemi varsa bunu bekletir (Suspend) Yeni bir tane açarak kendi işini hallettikten sonra bu transaction işlemini kaldığı yerden devam ettirir.2 transaction bağlantısızdır.

3.NESTED : JDBC kullanılan yapılarda geçerli bir kuraldır. JDBC 3.0 ile gelen savepoint teknolojisini kullanarak yapar. Savepoint e biraz değinecek olursak JDBC de connection larımızı commit ettiğimizde rollback şansımız olmazdı onun için öncelikle conn.setAutoCommit(false) şeklinde özelliğini kapatmamız gerekirdi.Daha sonra işlem sonuna conn.commit() diyerek transaction işlemini bitirilir Savepoint sayesinde belli blokları savepoint e arasına alarak bu alanların hata sırasında rollback yapılmasını sağlarız.Nested savepoint teknolojisini kullanarak yapar bu işlemi spring framework ünde.

4. SUPPORTS : Servis metodunda TX varsa çalıştırır yoksa Transaction sız çalıştırır

5.NOT_SUPPORTED : TX varsa suspend edilir servis metodu Transactionsız çalıştırılır

6.NEVER : TX varsa Exception fırlatır

7.MANDATORY : TX yoksa exception fırlatır

B.ReadOnly özelliği

Transaction işlemi sırasında Persistence Context içerisinde bulunan Entity lere flush(veritabanı ile senkronizasyon) yapılır.readOnly=true sayesinde doğrudan çalışır.

@Transactional(readOnly = false, propagation = Propagation. REQUIRES_NEW)

C.Timeout

Transaction işlemine timeout süresi tanımlayarak işlem bitmediği durumda TransactionTimeOut Exception fırlatılarak rollback olmasını sağlar.

@Transactional( timeout = 25)

D. rollbackFor

Transaction işlemi sırasında hata alındığında burada iki yol ayrımına gelinir

1. Check exception : Sizin kontrolünüzde ki hatalar.

2. Uncheck exception : Kontrol edemediğiniz hatalar (ör:RuntimeException)

Servis metodunuzda rollback işlemini kontrol etmiş olduğunuz hata esnasında yapmasını ayarlayabilir ve bu hata dışındakilere bakmadan transaction işlemini commit edebilirsiniz.Bunun için rollbackFor için yazacağınız custom Exception class ınız Throwable class ından extend etmelidir.

@Transactional(rollbackFor = TransactionalRollBackException.class)

Yakın bir zamanda bu anlattıklarım ile ilgili güzel bir örnek yapıp GitHub atacağım buradan link paylaşıyor olurum

--

--