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也会在它们之间进行一些无法控制的刷新?!
刷新不应影响所有的交易管理.回滚事务时,将回滚对该事务内的数据库状态所做的所有更改(即由Hibernate刷新的更改).
@Transactionalis的默认传播策略PROPAGATION_REQUIRED.这意味着您可以安全地@Transactional从其他@Transactional方法调用方法,并且它们将使用由顶级事务方法创建的相同事务.如果您明确提供不同的传播设置,则情况并非如此.
因此,这意味着在执行顶级@Transactional方法期间发生的任何失败(即从该方法抛出的任何异常)都应该导致回滚,并且在这种情况下应该回滚所有更改.
如果您观察到不同的行为,可能是某些内容配置错误(例如,顶层@Transactional因某种原因无法生效).尝试在测试中重现此行为.
| 归档时间: |
|
| 查看次数: |
3368 次 |
| 最近记录: |