- 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.