CMT交易

时间:2013-01-22 15:41:36

标签: jboss ejb transactional

我身边还有一个问题...... 如果我有一个无状态服务(无状态会话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会被保存?

1 个答案:

答案 0 :(得分:0)

对我感到羞耻......这是不恰当的异常处理,导致客户在继续第二笔交易之前停止了世界。