【问题标题】:Spring return null when transaction rollback事务回滚时Spring返回null
【发布时间】:2018-05-23 13:53:03
【问题描述】:

你能告诉我如何只为某些代码块运行事务吗?我有 @Transactional 的服务函数,我从它们调用存储库函数来执行查询。但是当查询失败时,它也使服务功能失败,因为必须结束事务。那么当存储库函数失败时我怎么能返回空值呢?失败时我需要捕获空值,并继续一些逻辑。我的代码:

public class SomeService{

    @Autowired
    SomeRepository repo;

    @Transactional
    public int getSomeValue(){

        MyObj obj = repo.getLastItem(); // this failed because not items in table, so I need here null
        if (obj != null) {
            //some calculations
            return [calculatedValue]
        } else {
            return 1
        }

    }
}

编辑 我会尝试@davidxxx 的答案,我得到了这个错误:

事务被标记为仅回滚;不能提交;嵌套异常是 javax.persistence.PersistenceException: org.hibernate.TransactionException: 事务被标记为仅回滚;无法提交

【问题讨论】:

    标签: java spring transactions


    【解决方案1】:

    您可以在try/catch 语句中包含可能引发异常的代码,并指定您不希望回滚此特定异常:

    public static final int DEFAULT_VALUE_WHEN_GET_LAST_ITEM_FAILED = 1;
    ...
    @Transactional(rollbackFor = ExpectedException.class)
    public int getSomeValue(){
    
        try {
          MyObj obj = repo.getLastItem(); // this failed because not items in table, so I need here null   
          if (obj != null) {          
              return calculatedValue();
            }                     
        }
        catch(ExpectedException e){  
           //TODO exception logging
        }
    
        return DEFAULT_VALUE_WHEN_LAST_ITEM_FAILED;
    
    }
    

    【讨论】:

    • 但是当我捕捉到那笔交易时,交易并没有结束,还是会结束?
    • 如果有帮助的话,我在堆栈跟踪中发现了更长的错误消息。问题在于嵌套异常,因为我在事务中调用事务,但嵌套事务是回滚的。我要试试你的更新答案
    • 您可能不使用 Spring API:org.springframework.transaction.annotation.Transactional,而是使用 javax.transaction.Transactional。为什么不像使用 Spring 一样使用 Spring API?
    • 修复了 spring 的事务
    • 太棒了。还有问题:如果您使用 Spring 中的 @Transactional 并删除了 rollbackFor 属性,它仍然有效吗?
    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 2016-08-14
    • 2016-09-19
    • 2017-03-03
    • 2012-03-10
    • 2018-07-15
    • 2018-11-05
    相关资源
    最近更新 更多