首页 > 解决方案 > @Transactional(propagation = Propagation.NOT_SUPPORTED) 与根本没有 @Transactional 注释

问题描述

传播.NOT_SUPPORTED。以非事务方式执行,如果存在则暂停当前事务。

@Transactional(propagation = Propagation.NOT_SUPPORTED)与以下示例中根本没有注释相同@Transactional,前提是它m()不是从另一个@Transactional方法调用的:

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void m() {
        repo.insert(new B()); //insert() method is annotated with @Transactional(propagation = Propagation.REQUIRED)

}

是否为该insert()方法创建了新事务?什么时候应该Propagation.NOT_SUPPORTED使用?

标签: hibernatespring-data-jpa

解决方案


  1. @Transactional(propagation = Propagation.NOT_SUPPORTED)和没有一样吗@Transactional

    ,当我们从已经启动事务的方法调用 m() 时,它首先暂停当前事务,然后执行其工作,然后在返回后恢复暂停的事务。在没有@Transaction 的情况下,它不会暂停正在进行的事务。查看以下日志:

    osorm.jpa.JpaTransactionManager.getTransaction - [] Creating new transaction with name[] ohetinternal.TransactionImpl.begin - [] begin 。. osorm.jpa.JpaTransactionManager.handleExistingTransaction - [] Suspending current transaction 。. . osorm.jpa.JpaTransactionManager.cleanupAfterCompletion - []Resuming suspended transaction after completion of inner transaction

  2. 是否为 insert() 方法创建了新事务?

    是的,插入方法将开始新事务。

    ohetinternal.TransactionImpl.begin - [ ] begin
    [ ] Initiating transaction commit
    [ ]committing

注意:在 insert() 事务提交后,暂停的事务被恢复。

3.什么时候应该使用Propagation.NOT_SUPPORTED?

不太确定,您希望代码以非事务方式运行。如果以某种方式从事务所在的上下文中输入此代码,则暂停此事务并以非事务方式继续。


推荐阅读