我这边还有一个问题......如果我有一个无状态服务(Stateless Session 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?
我最初的想法是,它不会影响交易,但Jboss证明我错了......
这是人们可以预料到的行为吗,我错了吗?如果是这样……如何隔离它们: Foo 导致异常并且显然没有被保存但 Bar 被保存?