gpt4 book ai didi

java - hibernate/JPA : Are nested flushes rolled back if @Transactional fails?

转载 作者:行者123 更新时间:2023-11-29 10:15:11 24 4
gpt4 key购买 nike

假设我在某处有注释为 @Transactional 的方法(因此开始事务)并在内部执行多个 saveAndFlush()。也许我什至调用一些依赖项,这些依赖项具有通过注释 @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);
}
}

再一次:如果说最后一步失败了怎么办,hibernate 是否仍会回滚之前在 doStuff() 中发生的所有事情?因为我有一种感觉它没有。如果由于 saveAndFlush() 而无法完全回滚,那么仅使用 save() 并在事务结束时等待自动刷新是否有帮助?我刚刚读到,即使在离开 @Transactional block 之前,hibernate 也会自行进行一些无法控制的刷新?!

最佳答案

  • 刷新不应影响所有事务管理。当事务回滚时,该事务内对数据库状态所做的所有更改(即由 Hibernate 刷新的更改)都会被回滚。

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

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

如果您观察到不同的行为,可能是配置错误(例如,顶级 @Transactional 由于某种原因没有生效)。尝试在测试中重现此行为。

关于java - hibernate/JPA : Are nested flushes rolled back if @Transactional fails?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19787147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com