【问题标题】:FlushMode type Commit used with REQUIRES_NEW Transaction AttributeFlushMode 类型 Commit 与 REQUIRES_NEW 事务属性一起使用
【发布时间】:2012-08-10 05:39:36
【问题描述】:

我正在使用 JBoss 7.1.1 Final、Weld、Hibernate 4、Seam 3 进行开发,但我不理解以下行为。我使用Seam Managed Persistence Context for Entity manager and Persistence Interceptor from 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 刷新类型,所以会调用刷新

8) 交易 A 被打开

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

我在哪里犯错了?是不是有什么误会?

【问题讨论】:

  • 你调试过交易吗?以log4j.logger.org.jboss.seam.transaction=DEBUG 为例,如果您使用的是 log4J。

标签: ejb cdi seam3


【解决方案1】:

通过查看您的代码,我会说 - 因为RegistrationController 是一个普通的托管 bean - 它将不会开始自己的事务。这基本上意味着你有一个事务 B。

【讨论】:

  • 好吧,但是在托管 bean 中的 em.find(Person.class, p.getId()) 被调用之前,它仍然应该提交(因此刷新)。此外,我使用的是 Seam 3 的 Persistence 模块,所以实际上事务是在托管 bean 中自动启动的。
  • 我明白了。嗯。我仍然认为问题来自意外的事务行为——我依稀记得事务边界有专用的日志记录选项——这应该会让你更进一步......
  • 似乎如果我在服务(EJB)中使用 SMPC,它不起作用,但如果我使用 @PersistenceContext 来获取我的实体管理器,它工作正常。我不明白这种行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2016-09-10
  • 2012-10-14
  • 2016-10-04
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多