【问题标题】:@AfterReturning aspect executes in same transaction of pointcut method?@AfterReturning 方面在切入点方法的同一事务中执行?
【发布时间】:2016-09-09 07:36:47
【问题描述】:

我需要在执行函数后执行任务。我为此使用了 Aspect。但我有些困惑。

我在 spring 服务中有一个函数 A()。

@Transactional(readOnly = false,
               isolation = Isolation.DEFAULT,
               propagation = Propagation.REQUIRED,
               rollbackFor = {Exception.class})
void A() {
 //Do Something
}

我在这个函数上有一个@Afterreturning 方面。

 @AfterReturning(pointcut = "execution(Sevice.saverecord(..)) ")
 public void processNotifications(JoinPoint jp) {}

我想知道这个切面是使用metod A() 的事务还是自动创建一个新事务。因为我没有在这个方面方法上定义任何事务。

我尝试在这两种方法中使用 TransactionAspectSupport.currentTransactionStatus().toString() 打印交易详情。我得到了两个不同的 ID。

谁能解释这是否意味着有两个交易,如果是,第二个交易来自哪里?

【问题讨论】:

    标签: java spring hibernate transactions aspect


    【解决方案1】:

    @AfterReturning 方面在与建议方法相同的事务中执行。

    调用事务方法时的执行顺序如下图所示(ref - spring docs

    方面(即自定义顾问)可以配置为在事务通知之前或之后运行,默认情况下是之后

    有关如何配置自定义顾问程序以在事务建议之前运行的进一步参考,请使用Ordered,如here 所述。

    【讨论】:

    • 感谢您的解释。刚刚还有一个疑问。如果我在 afterReturning() 函数上使用新事务 (REQUIRES_NEW),它不会启动新事务,而是选择旧事务。
    • 是的,这是意料之中的,因为通知和目标方法包含在同一个事务中,它将继续使用现有的,即旧的。您可以针对您的场景探索PROPAGATION_NESTED
    • 我在我的应用程序中使用 JpaTransactionManager,并且此 transactionManager 不支持 PROPAGATION_NESTED。我收到以下错误:org.springframework.transaction.NestedTransactionNotSupportedException:JpaDialect 不支持保存点 - 检查您的 JPA 提供程序的功能。是否有任何其他替代方法可用于实现类似“每当数据库层回滚发生任何异常时,应仅发生在特定保存点。
    • 您应该切换到DataSourceTransactionManager 以获得保存点支持
    • 修正上述场景会发生回滚;最好切换到DataSourceTransactionManager
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多