2 回答

TA贡献1826条经验 获得超6个赞
一切都与事务边界有关。
如果您的方法在任何事务之外被调用,则底层 entityManager 已经关闭并且返回的实体已分离。
如果您的方法在现有事务中被调用,则 entityManager 仍处于打开状态并且返回的实体处于托管状态。请注意,在这种情况下,如果事务被标记为只读,则 entityManager 将永远不会被刷新,即使实体被管理,也不会保留任何修改。
另请注意,内部逻辑事务属性不会覆盖readOnly 标志(与 rollbackFor 相反)
public class A {
@Transactional(propagation = Propagation.REQUIRED)
public void performA() {
// b transaction scope is not read only, but TransactionManager will rollback for checkedException thrown from here
b.performB();
}
}
public class B {
@Transactional(readOnly = true, propagation = Propagation.REQUIRED, rollbackFor = CheckedException.class)
public void performB() {
}
}
添加回答
举报