Bildirime dayalı işlem kapsamı
Hem Bahar hem de JPA @Transactionek açıklaması, belirli bir uygulama işleminin kapsamını tanımlamanıza izin verir.
Bu nedenle, bir hizmet yöntemi ek açıklama ile @Transactionalaçı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.TransactionalEk 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
noRollbackForve noRollbackForClassName: Exceptionbir işlem geri dönüşünü tetiklemeden tetiklenebilecek Java sınıflarının listesi
rollbackForve rollbackForClassName: Exceptionatıldığında bir işlem geri dönüşünü tetikleyen Java sınıflarının listesi
propagation: PropagationEnum 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.
valueveya transactionManager: TransactionManagerişlem bağlamını bağlarken kullanılacak Bahar fasulyesinin adı .
Java EE @Transactional
javax.transaction.TransactionalAçı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 @Transactionalyalnızca 3 özniteliği tanımlar:
dontRollbackOn: Exceptionbir işlem geri dönüşünü tetiklemeden tetiklenebilecek Java sınıflarının listesi
rollbackOn: Exceptionatıldığında bir işlem geri dönüşünü tetikleyen Java sınıflarının listesi
value: TxTypeEnum 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 @Transactionalaçı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 @Transactionalaçıklamasını kullanın .
Spring veya Java EE @Transactionaltanı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.Transactionalbö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.