Hibernate/JPA:如果@Transactional失败,是否会回滚嵌套刷新?

Pet*_*ete 1 java hibernate jpa transactions rollback

假设我有@Transactional一个注释的方法(因此启动一个事务),里面做几个saveAndFlush().也许我甚至调用一些依赖项,该依赖项具有一个方法,通过注释来启动它自己的(sub?nested?)事务@Transactional.如果事务在两者之间的某个地方失败,那么会回滚什么?

一些例子:

public class ComplexProcess {
    @Inject
    private DAO<SomeEntity> someEntityDao;

    @Inject
    private SomeManagerClass manager;

    @Transactional
    public void doStuff(SomeEntity entity) {
        manager.createAnObjectDependingOnEntity(entity);
        entity = someEntityDao.saveAndFlush(entity); // what if this fails?
        manager.doMoreStuffDependingOnEntity(entity);
    }
}

public class SomeManagerClass {

    @Inject
    private DAO<SomeObject> someObjectDao;

    @Inject
    private DAO<SomeOtherEntity> someOtherEntityDao;

    // what if this fails?
    @Transactional // what if this isn't there?
    public void createAnObjectDependingOnEntity(SomeEntity entity) {
        SomeObject someObject = createSomeObjectDependingOnEntity(entity);
        someObjectDao.saveAndFlush(someObject);
    }

    // what if this fails?
    @Transactional // what if this isn't there?
    public void doMoreStuffDependingOnEntity(SomeEntity entity) {
        SomeOtherEntity someOtherEntity = whatever(entity);
        someOtherEntityDao.safeAndFlush(someOtherEntity);
    }
}
Run Code Online (Sandbox Code Playgroud)

再说一遍:如果说最后一步失败,休眠还会回滚之前发生的一切doStuff()吗?因为我有一种感觉它没有.如果完全回滚是不可能的saveAndFlush(),那么只会save()在事务结束时使用并等待自动刷新帮助吗?我刚才读到,即使在离开@Transactional块之前,hibernate也会在它们之间进行一些无法控制的刷新?!

axt*_*avt 7

  • 刷新不应影响所有的交易管理.回滚事务时,将回滚对该事务内的数据库状态所做的所有更改(即由Hibernate刷新的更改).

  • @Transactionalis的默认传播策略PROPAGATION_REQUIRED.这意味着您可以安全地@Transactional从其他@Transactional方法调用方法,并且它们将使用由顶级事务方法创建的相同事务.如果您明确提供不同的传播设置,则情况并非如此.

因此,这意味着在执行顶级@Transactional方法期间发生的任何失败(即从该方法抛出的任何异常)都应该导致回滚,并且在这种情况下应该回滚所有更改.

如果您观察到不同的行为,可能是某些内容配置错误(例如,顶层@Transactional因某种原因无法生效).尝试在测试中重现此行为.