2011-06-22 12 views
8

Yayılma Destekleri ile yay işleminin kullanılmasının kullanımını anlamak istiyorum. Java docs, bir işlem içinde @Transactional(propagation = Propagation.SUPPORTS) olan yöntemin çağrılması halinde, işlemi desteklediği, ancak herhangi bir işlem yoksa, yöntemin işlem dışı yürütüldüğünü belirtmektedir.Yayılımı Destekleyen Yay İşlemleri

Bu zaten Propagation.SUPPORTS'dan bağımsız olarak bahar işlemlerinin davranışı değil midir? Yukarıdaki kod örneğinde

 


public class ServiceBean { 

    @Transactional(propagation = Propagation.SUPPORTS) 
    public void methodWithSupportsTx() { 
     //perform some database operations 
    } 
} 

public class OtherServiceBean { 

    @Transactional(propagation = Propagation.REQUIRED) 
    public void methodWithRequiredTx() { 
     //perform some database operations 
     serviceBean.methodWithSupportsTx(); 
    } 
} 

 

, bağımsız methodWithSupportsTx() bir işlem, doğru methodWithRequiredTx() @Transactional ek açıklama olup olmadığına bağlı olarak yürütülen olacaktır @Transactional(propagation = Propagation.SUPPORTS) ek açıklama olup olmadığı?

YÜKSEK VERİMLİLİK seviyesine sahip olmanın gerekliliği/kullanımı nedir?

cevap

0

Gerekli bir işlem, mevcut değilse yeni bir işlem oluşturur. Bu nedenle, serviceBean.methodWithSupportsTx() öğesini çağırdığınızda yeni bir işlem yapılacaktır. Eğer yönteminiz gerçekten işlemsel ise, herhangi bir işlem yoksa yaydan bir hata göreceksiniz. javadoc itibaren

+0

Sanırım öyle değil. Bir yayma yalnızca yayılma seviyesi ASLA olduğunda atılır. Ayrıca PROPAGATION.SUPPORTS yeni bir işlem oluşturmuyor. –

4

:

Not: senkronizasyon için geçerli olacağını bir işlem kapsamını tanımlar olarak işlem senkronizasyonu ile işlem yöneticileri için, PROPAGATION_SUPPORTS, hiç işlemden biraz farklıdır. Sonuç olarak, belirtilen tüm kaynaklar için aynı kaynaklar (JDBC Bağlantısı, Hazırda Bekletme Oturumu, vb.) Paylaşılacaktır. Bunun işlem yöneticisinin gerçek senkronizasyon yapılandırmasına bağlı olduğunu unutmayın.

Yani, örneğin, hazırda en SessionFactory.getCurrentSession()methodWithSupportsTx() içine birden fazla çağırmaları aynı oturumu döneceğini, anlamına gelir.

+0

Metot yöntemiyleWithSupportsTx() işlemsel bir açıklama içermiyor mu, bir işlemde methodWithSupportsTx() çağrıldığında aynı oturumun İADE EDİLEMEDİğini mi söylüyorsunuz? –

+0

@Amit: Aslında, 'Transactional '' CallCurrentSession() işlevini' hibernateTransactionManager 'ile yapması denemeden "bir iş parçacığına bağlı hiçbir hazırda bekletme oturumu yok ve yapılandırma burada işlem olmayan bir tane oluşturulmasına izin vermiyor" istisna. – axtavt

+0

Hayır, methodWithSupportsTx() yönteminde Transactional ek açıklamaları yoksa ve bu yöntem zaten bir işlemde olan başka bir yöntemden çağrılırsa, hazırda bekletme, hazırda bekletme işlemini aynı oturumda hazırda bekletir.(). Bu tam olarak yukarıdaki soruda belirttiğim örnek - methodWithRequiredTx() üzerindeki @Transactional ek açıklaması yeni bir işlem oluşturur ve daha sonra serviceBean.methodWithSupportsTx() yöntemini çağırır, dolayısıyla methodWithSupportsTx() tarafından yürütülen kod zaten bir işlemde olurdu, değil mi? –