2011-12-13 26 views
13

bir EJB bir (işlemsel) yöntemi başka EJB yöntemi başka (işlemsel) çağırır ve bir istisna saniyede atılmış, ancak ilki catched edilir, işlem otomatik olarak görünüyor İkincisi geri geldiğinde, ilk yakalansa bile geri döndüğünde, bu doğru mu? Bunu nasıl önleyebilirim?EJB: kaçının İşlem geri alma

senaryo aşağıdaki biridir: istisnası çalışma zamanı istisnası ise

@Stateless 
class ClassA { 
    @EJB 
    ClassB objectB; 

    methodA() { 
     try { 
      objectB.methodB(); 
     } 
     catch(Exception e) { 
      //Here the transaction started in this method is 
      //automatically rolled back. Is this avoidable? 
     } 
    } 
} 

@Stateless 
class ClassB { 
    methodB() throws Exception { throw new Exception() } 
} 

cevap

19

İşlem bu kadar, rollback özniteliği ile @ApplicationException açıklama true ayarlı olduğu bir RuntimeException veya herhangi İstisna atmak geri durumda sarılır:

@ApplicationException(rollback=true) 
public class MyException extends Exception { 
    // ... 
} 

akım İşlem geri olacaktır. Varsayılan ApplicationException By

senin İşlem geri gelmez.

size ApplicationException ait geri alma davranışını değiştirmek veya işlem paylaşımını engelleyebilir ya işleminizi geri almak Yöntemib için istemiyorsanız.

ikinci RequiresNew için Yöntemib yani, TransactionAttribute değiştirerek elde edilebilir. Daha sonra, methodA işlemi (Tx1) askıya alınır ve methodB'nin, işleminin geri alınmasıyla sonuçlanan bir istisna (Tx2) atması durumunda, yine de methodA'da yakalayabilir ve methodA işleminizin (Tx1) geri alınmasını önleyebilirsiniz.

8

Evet, bu doğru. Kontrol edilen istisnalar, işlem geri alma işlemine neden olmaz.

sadece methodB kod herhangi bir çalışma zamanı istisna değil emin olun, bunu önlemek için. Bir çalışma zamanı istisnası normal olarak bir hatayı veya çalışmayı sürdürmesine izin vermeyen bir durumu belirtir.

+0

Benim kötü, üzgünüm, ben, işlem bu senaryoda da geri alınıyor bir kontrol istisna atıyor unutmayın soruyu modifiye? – edutesoy

+1

Hayır, istisna kontrol edilen bir istisna ise geri alınmamalıdır. –

+1

Tek yapmanız gereken, Özel Durum'un işaretli olması durumunda, işleminizin geri dönüp dönmeyeceğini veya geri alıp almayacağını söyleyemezsiniz. @ @ UygulamasıException (rollback = true) ise, işleminizi geri alabilir. –