鉴于此示例代码:
public class MyServiceImpl implements MyService { @Transactional public void myTransactionalMethod() { List- 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事务通过代理实现.代理是你班级的包装.您正在processItem
从同一个类访问该方法,即您没有通过代理,因此您不会获得任何事务.几年前我在这个答案中解释了这个机制.
解决方案:如果需要嵌套事务,则需要两个单独的Spring bean,它们都必须由代理进行代理@Transactional
.