2011-11-09 23 views
7

Aynı sınıfta başka bir Transactional yöntemini çağıran bir Transaction yöntemi olan bir @Service sınıfım var. Bunun için geri alma davranışını test ediyordum ve düzgün çalışmadığını buldum. "- geri alma JDBCTransaction" log gösterdiği halde ben veritabanını kontrol edip değişiklikler vardır methodOne çalıştırdıktan sonraYaylı @Transaction yöntemi ve geri alma

@Service 
public class DefaulService implements ervice 
{ 
    @Transactional 
    public void methodOne() 
    { 
     methodTwo(); 

      //question edited 
      //this seems to be the problem 
      this.serviceDAO.executeUpdateOperation(); 

     //test rollback 
     throw new RuntimeException(); 
    } 

    @Transactional 
    public void methodTwo() 
    { 
     //DAO stuff 
    } 
} 

: Kod şöyle görünür.

Ben teker teker yöntemini çağırır ve sonunda bir istisna eklerseniz, değişiklikler doğru şekilde geri alınır.

İç içe @Transaction çağrısı sırasında gerçekleşen değişikliklerin doğru bir şekilde geri alınmasını sağlamanın bir yolu var mı? REQUIRED'in varsayılan yayılımının bunu başaracağı izlenimindeydim, ama işe yaramıyor gibi görünüyor. Teşekkür

Tamam GÜNCELLEME, sadece başka bir şey fark ettim. İstisna atmadan hemen önce, servisin servisini arıyorum ve 'executeUpdate' aracılığıyla manuel güncelleme yapıyorum. Bu satırı yorumlarsam, içe aktarılan rollback çalışır. Yani sorun aslında DAO çağırıyor ve executeUpdate sorgusu çalıştırıyor gibi görünüyor. Fakat bu, mevcut işlem içinde de çalışmıyor mu?

+0

'methodOo()' '' Transactional 'ifadesinden 'methodTwo()' işlevini çağrıldığında eski kodun dikkate alınmadığını biliyor musunuz? Daha fazla bilgi için [makale] bölümüne bakın (http://nurkiewicz.blogspot.com/2011/10/spring-pitfalls-proxying.html). Ancak bu sizin sorunlarınıza neden olmaz, ancak bilmeye değer. –

+0

Evet, ancak MethodTwo bağımsız olarak çağrılabildiğinden, bu gibi durumlarda kendi ek açıklamalarına ihtiyacı vardır. Şu anda, executeUpdate'in neden işlemin gerçekleşmesine neden olduğu konusunda stumped, belki de bu varsayılan davranıştır. – JayPea

+1

serviceDao işlem yayımı nedir? REQUIRES_NEW herhangi bir şansa mı bağlı? – Hendrik

cevap

1

Yöntemleri çağırdığınızda, fasulye fabrikasından "servis" örneğini almaktasınız, doğru mu? Fasulye fabrikasının, her yöntem çağrısı etrafındaki işlem mantığını uygulayan bir proxy kurması gerekir. Bu yalnızca "dışarıdan gelenler" proxy aracılığıyla yöntemleri çağırdığında işe yaramış izlenim altındaydım ve bir yöntem başka bir nesneyi çağırdığında işe yaramaz, çünkü bu yöntem uygulama nesnesinin içinde doğrudan bir çağrıdır ve AOP proxy'si üzerinden gitmez.

+0

Bu, kullandığınız AOP yaklaşımına bağlıdır. Tomasz Nurkiewicz'den [link] (http://nurkiewicz.blogspot.com/2011/10/spring-pitfalls-proxying.html) adresini kontrol edin. Ayrıca JayPea'nın tanımladığı davranışları açıklayamaz. –