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被保存?