2013-01-22 68 views
1

從我的身邊還有一個問題...... 如果我有一個無狀態的服務(無狀態會話Bean)的正面(說GlobalService),該方法調用其他幾個服務(再次SLSBs,說FooService接口和BarService):CMT交易

@Stateless 
@Remote(GlobalService.class) 
@TransactionManagement(TransactionManagementType.CONTAINER) 
public class GlobalServiceBean implements GlobalService{ 
private Logger log = Logger.getLogger(GlobalServiceBean.class); 

@EJB 
private FooService fooService; 

@EJB 
private BarService barService; 

public void createFoo(Foo foo, Bar bar) throws WrappedGoneBadException{ 
      fooService.create(foo); // bang here 
       barService.create(bar); // no bang here 

標註爲需要一個新的事務在FooService接口的所有方法(以及BarService,看起來幾乎相同):

@Stateless 
@Remote(FooService.class) 
@TransactionManagement(TransactionManagementType.CONTAINER) 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public class FooServiceBean implements FooService{ 
    public Foo save(Foo foo){ 
    ... // exception here 

假定FooServiceBean持續在這種類型的「富」和一些對象,一個未經檢查的例外(Dup licateKeyException)會被拋出這會影響'周圍'的事務回滾還是會被忽略,Bar會被創建?

我最初的想法一直,也不會影響交易,但Jboss的證明我錯了......

這是一個可以預期的行爲,我錯了,如果是......怎麼兩個隔離其中:Foo引起異常,顯然沒有保存但Bar被保存?

回答

0

對我感到羞恥......這是不合適的異常處理,導致客戶在繼續第二個事務之前停止世界。