鉴于此示例代码:
public class MyServiceImpl implements MyService {
@Transactional
public void myTransactionalMethod() {
List<Item> itemList = itemService.findItems();
for (Item anItem : itemList) {
try {
processItem(anItem);
catch (Exception e) {
// dont rollback here
// rollback just one item
}
}
}
@Transactional
public void processItem(Item anItem) {
anItem.setSomething(new Something);
anItem.applyBehaviour();
itemService.save(anItem);
}
}
这是我想要实现的:
- 只有
processItem(anItem);
应该在内部发生异常时回滚。 - 如果发生异常,
myTransactionalMethod
应该继续,这意味着 for-each 应该结束。 - 如果异常发生在
myTransactionalMethod
而不是在processItem(anItem)
中,myTransactionalMethod
应该完全回滚。
有没有不涉及手动管理事务(没有注释)的解决方案?
编辑:我正在考虑使用 @Transactional(PROPAGATION=REQUIRES_NEW)
,但不知道它是否可以在同一个 bean 中工作。
最佳答案
这是一个常见的误解。 Spring Transactions 是通过代理实现的。代理是您类(class)的包装器。您正在从同一类访问 processItem
方法,即您不通过代理,因此您不会获得任何交易。 I explained the mechanism in this answer几年前。
解决方案:如果你想要嵌套事务,你需要两个单独的 Spring bean,它们都必须由 @Transactional
代理。
关于java - Hibernate/Spring - 在事务中回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268512/