Transactions in Spring Boot

  • Service methodlarında @Transactional annotation’ı ile kullan.
  • @Transactional kullanıldığında, (unchecked) runtimeException veya alt sınıflarından biri (nullPointer, arithmetic, illegalArgument vb. ) fırlatıldığında default olarak rollBack yapılır. Commitler geri alınır.
  • Checked bir exception fırlatıldığında (Exception.class – derleme zamanında) default olarak rollBack işlemi yapılmaz.
  • @Transactional(rollbackFor = DataIntegrityViolationException.class) ile rollBackFor işlemi yapılır.
  • throw ile fırlatılan DataIntegrityViolationException, ErrorControllerAdvice içinde runTimeException olarak yakalanır ve hata sayfasına yönlendirme yapılır.
  • Bir method içinde, başka bir methoda çağrı yapıldığını ve orada bir commit işlemi yapıldığını düşünelim. Sonrasında ana method içinde bir exception yakalandığında rollBack işlemi ile yapılan değişikliklerin tamamı geri alınır.
  • Annotation ekleme işlemi service methodlarında yapılmalıdır, controller içinde değil.
  • Bilinmesi gerekenler : isolation, propagation, noRollBackFor
  • isolation seviyeleri : (artan sırada) read uncommited, read commited, repeatable read, serializable
  • read uncommited: Diğer transactionlar, bu transactionun henüz commit etmediği verileri görebilir.
  • read commited: Diğer transactionlar, bu transactionun commit ettiği verileri görebilir.
  • repeatable read: Transaction sırasında yapılan değişiklikler, diğer transactionlar tarafından görülmez; aynı veriyi okuduğunuzda değişmemiş olarak görünür.
  • serializable: Tam izole edilmiş transactionlar sağlar, her transaction sıralı olarak çalışır ve diğer transactionların verilerini etkilemez.
  • Seviye arttıkça sistemin yükü, kilitlenmesi de artar. Üst seviye isolation seviyeleri kullanırken buna dikkat etmeliyiz.