Bildirime dayalı işlem kapsamı
Hem Bahar hem de JPA @Transaction
ek açıklaması, belirli bir uygulama işleminin kapsamını tanımlamanıza izin verir.
Bu nedenle, bir hizmet yöntemi ek açıklama ile @Transactional
açıklanırsa, işlem bağlamında çalışır. Hizmet yöntemi birden fazla DAO veya Depo kullanıyorsa, tüm okuma ve yazma işlemleri aynı veritabanı işleminde yürütülür.
İlkbahar @Transactional
org.springframework.transaction.annotation.Transactional
Ek açıklama (2005 dolaylarında) Bahar çerçevesinin 1.2 sürümünde beri piyasada bulunmakta ve bu aşağıdaki işlem özelliklerini ayarlamanızı sağlar:
isolation
: temeldeki veritabanı izolasyon düzeyi
noRollbackFor
ve noRollbackForClassName
: Exception
bir işlem geri dönüşünü tetiklemeden tetiklenebilecek Java sınıflarının listesi
rollbackFor
ve rollbackForClassName
: Exception
atıldığında bir işlem geri dönüşünü tetikleyen Java sınıflarının listesi
propagation
: Propagation
Enum tarafından verilen işlem yayılma türü . Örneğin, işlem bağlamı miras alınabiliyorsa (ör. REQUIRED
) Veya yeni bir işlem bağlamı oluşturulmalıysa (ör. REQUIRES_NEW
) Veya herhangi bir işlem bağlamı yoksa (ör. MANDATORY
) Veya bir istisna atıldıysa bir istisna atılmalıysa mevcut bir işlem içeriği bulunursa (örneğin, NOT_SUPPORTED
).
readOnly
: geçerli işlemin herhangi bir değişiklik yapmadan verileri okuyup okumayacağı.
timeout
: işlem bağlamının bir zaman aşımı istisnası atılana kadar kaç saniye çalışmasına izin verilecek.
value
veya transactionManager
: TransactionManager
işlem bağlamını bağlarken kullanılacak Bahar fasulyesinin adı .
Java EE @Transactional
javax.transaction.Transactional
Açıklama (2013 dolaylarında), Java EE 7 tarifname ile eklenmiştir. Bu nedenle, Java EE açıklaması, Bahar mevkidaşından 8 yıl sonra eklendi.
Java EE @Transactional
yalnızca 3 özniteliği tanımlar:
dontRollbackOn
: Exception
bir işlem geri dönüşünü tetiklemeden tetiklenebilecek Java sınıflarının listesi
rollbackOn
: Exception
atıldığında bir işlem geri dönüşünü tetikleyen Java sınıflarının listesi
value
: TxType
Enum tarafından verilen yayılma stratejisi . Örneğin, işlem bağlamı miras alınabiliyorsa (ör. REQUIRED
) Veya yeni bir işlem bağlamı oluşturulmalıysa (ör. REQUIRES_NEW
) Veya herhangi bir işlem bağlamı yoksa (ör. MANDATORY
) Veya bir istisna atıldıysa bir istisna atılmalıysa mevcut bir işlem içeriği bulunursa (örneğin, NOT_SUPPORTED
).
Hangisini seçmeli?
Spring veya Spring Boot kullanıyorsanız @Transactional
, Java EE @Transactional
açıklamasından daha fazla özniteliği yapılandırmanıza izin verdiği için Spring açıklamasını kullanın .
Yalnızca Java EE kullanıyorsanız ve uygulamanızı bir Java EE uygulama sunucusunda dağıtıyorsanız, Java EE @Transactional
açıklamasını kullanın .
Spring veya Java EE @Transactional
tanımlarını kullanırken yalıtım düzeyi yapılandırmasının nasıl farklı olduğu hakkında daha fazla ayrıntı için bu makaleye göz atın .
javax.transaction.Transactional
böylece artık herhangi bir ek işlem yapmadan Spring uygulamalarında da kullanılabilir. IMO, bu tasarım açısından oldukça kötü bir karardı , çünkü deneyimlerime göre birçok geliştirici bu ikisini kodlarında bilinçsizce karıştırıyor ve bu da daha sonra sorunlara yol açıyor.