javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional


161

Ben ek açıklamaları arasındaki gerçek fark nedir anlamıyorum javax.transaction.Transactionalve org.springframework.transaction.annotation.Transactional?

org.springframework.transaction.annotation.TransactionalBir uzantısı mı javax.transaction.Transactionalyoksa tamamen farklı bir anlamı mı var? Her biri ne zaman kullanılmalı? @TransactinalHizmet katmanında yay ve DAO'da javax ?

Cevabın için teşekkür ederim.

Yanıtlar:


135

Spring, yıllar önce Spring bean yöntemlerini işlemsel hale getirmek için kendi İşlem açıklamasını tanımladı.

Java EE 7 nihayet aynı şeyi yaptı ve şimdi EJB yöntemlerine ek olarak CDI bean yöntemlerinin işlemsel olmasına izin veriyor. Yani Java EE 7'den beri, kendi İşlem açıklamasını da tanımlıyor (açıkçası Spring'i yeniden kullanamıyor).

Bir Java EE 7 uygulamasında, Java EE açıklamasını kullanacaksınız.

Bir Bahar uygulamasında, Bahar açıklamasını kullanacaksınız.

Kullanımları aynıdır: kapsayıcıya (Java EE veya Spring) bir yöntemin işlemsel olduğunu bildirmek.


32
Bundan daha fazlası: Spring, evreni yönetmek için örtük destek de ekledi, 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.
Yuriy Nakonechnyy

17
Ayrıca, org.springframework.transaction.annotation.Transactionalteklifler daha fazla seçenek (gibi readOnly, timeoutyerine)javax.transaction.Transactional
pierrefevrier

1
@yura, hangi problemleri gözlemledin?
Lee Chee Kiam

1
@LeeCheeKiam lütfen aşağıdaki iki cevaba bakın
Yuriy Nakonechnyy

53

Diğer bir fark, Spring'in @Transactional ek açıklamalarını işleme biçimi

  • org.springframework.transaction.annotation.Transactional her zaman dikkate alınır
  • javax.transaction.Transactional , yalnızca EJB3 işlemleri mevcut olduğunda dikkate alınır. EJB3 işlemlerinin varlığı, sınıf javax.ejb.TransactionAttributeyolunda sınıfın mevcut olup olmadığı kontrol edilerek yapılır (sürüm 2.5.3'ten 3.2.5'e). Böylece, yalnızca javax.transaction.Transactionalsınıf yolunuzda yer alıyorsa ve değilse notlarınızın dikkate alınmamasına neden olabilirsiniz javax.ejb.TransactionAttribute. Hazırda bekletme ile çalışıyorsanız durum bu olabilir: hazırda bekletme çekirdeği (4.3.7.Final), sunmayan jboss-transaction-api_1.2_spec (1.0.0.Final) 'e bağlıdır javax.ejb.TransactionAttribute.

9
Bunun artık Bahar 4.2.0: javax.transaction
Arend - Reinersdorff

her zaman alınmaz, örneğin özel bir yöntem üzerindeyse alınmaz.
2018

37

Lütfen dikkatli olun (bu sorun tomcat'ta oldu),

Uygulamanız SPRING web uygulamasıysa ve Spring'in işlem işleme mekanizmasını kullanıyorsanız, @org.springframework.transaction.annotation.Transactionaljavax.transaction.Transactional ile karıştırmayın.

Bu, her zaman @org.springframework.transaction.annotation.Transactionalbir yay uygulamasında tutarlı bir şekilde kullanılır.

Aksi takdirde bu hatayla sonuçlanabilir,

org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed

........

Caused by: java.sql.SQLException: Protocol violation: [0]

1
Not: bu cevap, cevabımın özel bir durumu
Jidehem

8

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 .


Java / Jakarta EE @Transactional ek açıklaması privateyöntemler için çalışıyor mu?
Dina Bogdan

1
Büyük olasılıkla hayır. İşlem sınırı, web veya planlayıcı gibi farklı bir katmandan bir hizmet çağrıldığında başlamalıdır.
Vlad Mihalcea

Aslında, @Transactional ile ek açıklama eklenen yöntemle aynı sınıfta zaten bir temsilci yöntemine sahibim. Ek açıklamayı bu delege yöntemine taşıyabileceğimi biliyorum, ancak bunu merak ediyordum ve web'de hiçbir şey bulamadım.
Dina Bogdan

Özel yöntemler sayılmaz. Yayılma kuralları için yalnızca hizmetler arası yöntemler dikkate alınır .
Vlad Mihalcea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.