【问题标题】:TransactionAttributeType.REQUIRES_NEW in conjunction with @Observes(during = TransactionPhase.AFTER_SUCCESS)TransactionAttributeType.REQUIRES_NEW 结合@Observes(during = TransactionPhase.AFTER_SUCCESS)
【发布时间】:2017-07-30 07:12:20
【问题描述】:

我最近偶然发现了下一段 Java EE6 代码:

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
        public void example(@Observes(during = TransactionPhase.AFTER_SUCCESS) final ExampleEvent exampleEvent) {

真的需要REQUIRES_NEW 吗? 我的意思是示例方法总是会在之前的任何事务成功结束后调用only(因为TransactionPhase.AFTER_SUCCESS)。

还是我错过了什么?

【问题讨论】:

    标签: java transactions cdi jta


    【解决方案1】:

    您只观察ExampleEvent,因此您的example()-Method 不会被自己调用(基于@TransactionAttribute),除非您执行以下操作:

     @Inject
     private Event<ExampleEvent> exampleEvent;
    
    
     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
     public void example(@Observes(during = TransactionPhase.AFTER_SUCCESS) final ExampleEvent exampleEvent) {
        ExampleEvent event = new ExampleEvent();
        exampleEvent.fire(event);
    }
    

    保留@TransactionAttribute 是有意义的,因为上一个事务刚刚完成(AFTER_SUCCESS),因此没有当前事务,因此需要创建一个新事务。即使没有注释,这也可能会自动完成(取决于 AS 实现),但结果应该是相同的。

    【讨论】:

    • 还有另一个 bean 的方法可以触发 ExampleEvent。我要问的是 TransactionAttributeType.REQUIRES_NEW 是否是多余的,因为由于 (during = TransactionPhase.AFTER_SUCCESS) 无论如何都会启动新事务。
    • 正确,这就是我的意思,但是根据您的应用程序服务器的实现可能会有一些要求,您仍然必须声明它。如果没有@TransactionAttribute 也能正常工作,你可以坚持下去。
    猜你喜欢
    • 1970-01-01
    • 2013-11-24
    • 2012-03-06
    • 1970-01-01
    • 2015-09-07
    • 2012-07-21
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多