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
?
答案 0 :(得分: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
是否为insert()方法创建了新交易?
是的,新方法将开始插入方法。
o.h.e.t.internal.TransactionImpl.begin-[ ] begin
[] Initiating transaction commit
[] committing
注意:提交了insert()事务后,暂停的事务得以恢复。
3。何时应使用Propagation.NOT_SUPPORTED?
不太确定,您希望代码以非事务方式运行。如果您以某种方式从事务所在的上下文中输入此代码,则会暂停该事务并以非事务方式继续进行。