Hibernate/Spring - 在事务中回滚事务

dan*_*rba 3 java spring hibernate transactional

鉴于此示例代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的目标:

  1. 只有processItem(anItem);在其中发生异常时才应回滚.
  2. 如果发生异常,myTransactionalMethod应该继续,这意味着for-each应该结束.
  3. 如果异常发生在内部myTransactionalMethod但不在内processItem(anItem),myTransactionalMethod则应完全回滚.

是否存在不涉及手动管理事务(没有注释)的解决方案?

编辑:我正在考虑使用@Transactional(PROPAGATION=REQUIRES_NEW),不知道它是否会在同一个bean中工作.

Sea*_*oyd 7

这是一种常见的误解.Spring事务通过代理实现.代理是你班级的包装.您正在processItem从同一个类访问该方法,即您没有通过代理,因此您不会获得任何事务.几年前我在这个答案中解释了这个机制.

解决方案:如果需要嵌套事务,则需要两个单独的Spring bean,它们都必须由代理进行代理@Transactional.