@Transactional(propagation = Propagation.NOT_SUPPORTED)与完全没有@Transactional批注

时间:2019-11-21 17:14:39

标签: hibernate spring-data-jpa

  

Propagation.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

1 个答案:

答案 0 :(得分:1)

  1. @Transactional(propagation = Propagation.NOT_SUPPORTED)与否@Transactional相同吗?

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

    o.s.orm.jpa.JpaTransactionManager.getTransaction-[] Creating new transaction with name []  o.h.e.t.ternal.TransactionImpl.begin-[] begin  。  。  o.s.orm.jpa.JpaTransactionManager.handleExistingTransaction-[] Suspending current transaction  。  。  。  o.s.orm.jpa.JpaTransactionManager.cleanupAfterCompletion-[] Resuming suspended transaction after completion of inner transaction

  2. 是否为insert()方法创建了新交易?

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

    o.h.e.t.internal.TransactionImpl.begin-[ ] begin
    [] Initiating transaction commit
    [] committing

注意:提交了insert()事务后,暂停的事务得以恢复。

3。何时应使用Propagation.NOT_SUPPORTED?

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