Spring Boot Transactional Yönetimi

Yusuf BEŞTAŞ
3 min readNov 4, 2020

--

Transactionun ne olduğu ile ilgili kısa bir açıklama yaptıktan sonra hemen transaction özelliklerine geçebiliriz.

Transaction Nedir?

Transaction işlemleri bir veya birden fazla database işlemin bir bütün halinde gerçekleşmesidir.Yani metodumuzun içindeki işlemlerin tamamı başarılı bir şekilde gerçekleşmesinden sonra db işlemleri gerçekleştirir.Eğer işlemlerden herhangi birinde problem çıkarsa bütün işlemleri geri almalıdır.Böylece veri bütünlüğünü korumuş oluruz.Bu mekanizmaya rollback mekanizması diyoruz.

Örnek verecek olursak : Bir metodumuzun içinde database tarafında 5 farklı tabloya kayıt atacağımızı hayal edelim. Diyelim ki 4 tabloya kayıt attı fakat metod tamamlanmadan hata verdi.İşte bu nokta da rollback mekanizması devreye girer ve yapılan db işlemlerinin hepsini geri alır.

Transaction Özellikleri

Aşağıdaki grafikten özellikleri teker teker incelemeye başlayabiliriz.

  1. Propagation:Servis metodunda çağırdığımız zaman elimizdeki transactionun başlatılıp başlatılmayacağını veyahut mevcut transaction varsa bununla mı devam edecek yoksa yeni bir trancation mu açması gerek , gibi transactionun davranış şekillerini belirler.Propagation özelliklerini aşağıda incelemeye başlayalım.

1.1 Required:Propagationun default bir özelliğdir.Aktif bir transaction varsa devam eder, yoksa yeni bir transaction açar.Sadece @Transactional anatasyonu kullanırsa @Transactional(propagation=Propagation.REQUIRED) şeklinde davranır.Kod üzerinden örnek vermek gerekirse

function1() ve function2() aynı transaction içinde çalışır. save() metodu sonlanıncaya kadar function1() ve function2() larını aynı transactionlar yönetir

  1. 2:Propagation.SUPPORTS:Transaction varsa kullanır yoksa lazy davranır. Yeni bir transaction açmaz trancationsuz çalışır.Aşağıda kodu inceleyelim.

Eğer addProduct method direkt çağırılırsa.Kendisine bir transaction oluşturmaz.

Eğer addProduct metod başka bir servis çağırırsa ve bu servis bir transactiona sahipse bunu kullanır.Çağırdığı servis transactiona sahip değilse kendisine yeni bir transaction oluşturmaz.

1.3:Propagation.NESTED:Aslında isminden beli çıkarımlar yapılır.İç içe… Mevcut bir transaction varsa paralelinde başka bir transaction açar ve bu transaction rollback olurken diğeri çalışmaya devam eder.JDBC teknlojinin geliştirdiği savepointle kullanılır.Bu özellik için kod üzerinde göstererek ayrı bir yazı paylaşacağım.

  1. 4:Propagation.NEVER:

Eğer metod direkt çağırılırsa yeni bir transaction oluşturmaz.Eğer yukardaki metod başka bir servis çağırısa ve bu servisin bir transactionu varsa throw an exception fırlatır.Hatayı aşağıdaki görselde inceleyebilirsiniz.

Eğer çağırdığı servisin de bir transactionu yoksa yeni bir transaction oluşturmaz ve transaction olmadan hayatına devam eder.

  1. 5:Propagation.MANDATORY:İsminden de anlaşılacağı gibi NEVER özelliğinin tam tersi çalışır.Transaction yoksa exception fırlatır.

Eğer metod direkt çağırılırsa. Aşadağıdaki hata olan “throw an exception “ fırlatır.

Eğer metod başka bir servisi çağırsa..

Bu servis bir transactiona sahipse bunu kullanır.Sahip değilse will throw an exception hatassını fırlatır.

1.6:Propagation.REQUIRES_NEW:Aşağıda paintle çizmeye çalıştım.Biraz kötü çizdim farkındayım artık idare edin:)

Yukardaki görselde çizdiğim gibi aktif bir transaction varsa bunu bekletir kendine yeni bir transaction açar gerekli işlemleri yapıp bitirdikten sonra eski transactiona kaldığı yerden devam eder.

1.7:Propagation.NOT_SUPPORTED:Yukardaki görseli tekrar inceleyelim tek fark şu mevcut transaction varsa bunu bekletir yeni bir transaction açmaz.İşlemleri bitirdikten sonra aynı şekilde eski transactiona kaldığı yerden devam eder.

3.TimeOut :İşlemler belli bir süre içerisinde gerçekleşmediği zaman rollback yapar.Örnek verelim bir dış sistemle haberleşiyorsunuz dış sistemden uzun bir süre yanıt gelmeyince rolllback yapabilirsiniz.Kullanım biçimi

@Transactional(timeout=25)

4.rollbackFor:Bu özellik en sevdiğim özellik aslında…

Biz işlemlerimizi yaparken belli durumlarda rollback yapmasını veya yapmamasını istediğimiz durumlarda kullanırız.

@Transactional(noRollbackFor = {SocketTimeoutException.class,HttpHostConnectException.class)

yukardaki örnekte görüldüğü gibi ben SocketTimeoutException ve HttpHostConnectException exceptionları aldığım durumlarda rollback yapmasını istemiyorum işte böyle durumlarda kullanılır.

Bu yazımda daha çok Transaction Özellikleri olan :

REQUIRES_NEW ,

NOT_SUPPORTED,

MANDATORY,

NEVER,

SUPPORTS,

REQUIRED,

yetenekleri üzerinde daha çok durdum.Öbür özellikleri için ayrı ayrı yazılar paylaşıp kod üzerinde örneklendireceğim.

İyi çalışmalar.

--

--

No responses yet