当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Hibernate/Spring-在事务中回滚事务》经验,为你挑选了1个好方法。

鉴于此示例代码:

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中工作.



1> Sean Patrick..:

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

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

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有