FlushMode类型与REQUIRES_NEW事务属性一起使用的提交

时间:2012-08-13 23:27:46

标签: ejb cdi seam3

我正在使用JBoss 7.1.1 Final,Weld,Hibernate 4,Seam 3开发,我不理解以下行为。我使用Seam Managed Persistence Context for Entity manager和Persistence Interceptor来自Seam 3.我有以下CDI Bean:

 @ViewScoped
 @Named
 public class RegistrationController implements Serializable {

    @Inject
    private RegisterService service;

    @Inject
    private EntityManager em;

    public void register() {
          Person p = service.register("username","password");
          Person pp = em.find(Person.class, p.getId()); //returns null
    } 
 }

关注EJB

 @Stateless
 @Local(IRegisterService.class)
 public RegisterService implements IRegisterService {

      @Inject
      private EntityManager em;      

      @Override
      @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
      public Person register(String username, String password) {
           return em.merge(new Person(username, password));
      }
 }

因此,由于我使用Seam Persistence模块,我认为会发生这种操作流程:

1)从前端

调用registrationController.register()

2)启动新交易A

3)service.register(...)被称为

4)暂停事务A并创建事务B以执行service.register(因为它由REQUIRES_NEW注释)

5)执行service.register(...)已完成

6)交易B已提交

7)由于我使用COMMIT flush类型,因此将调用flush

8)交易A被打开

现在,em.find(Person.class,p.getId())正试图找到只是持久的人。由于事务B已提交且实体管理器已刷新,因此应该找到它。但它返回null。如果我手动刷新,那么它可以工作。

我在哪里弄错了?有一些误解吗?

1 个答案:

答案 0 :(得分:0)

从查看代码我会说 - 因为RegistrationController是一个普通的托管bean - 它将启动自己的事务。这基本上意味着你有一个交易B。