我身边还有一个问题...... 如果我有一个无状态服务(无状态会话Bean)作为外观(比如GlobalService),哪些方法调用其他几个服务(再次是SLSB,比如说FooService和BarService):
@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持久存在一些'Foo'类型的对象,在此期间,将抛出未经检查的异常(DuplicateKeyException),这会影响要回滚的“周围”事务,还是会被忽略并创建Bar? / p>
我最初的想法是,它不会影响交易,但Jboss证明我错了......
这是人们可以预期的行为,我是错的,如果是的话......如何隔离他们两个:Foo导致异常并且显然没有保存但Bar会被保存?
答案 0 :(得分:0)
对我感到羞耻......这是不恰当的异常处理,导致客户在继续第二笔交易之前停止了世界。