当前位置: 首页 > 知识库问答 >
问题:

事务回滚时Spring返回null

潘慈
2023-03-14

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

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的答案,得到了这个错误:

共有1个答案

李奕
2023-03-14

您可以在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;

}
 类似资料:
  • -ZJ 以下是我在Application.Properties中的数据源设置:

  • 我列出了一个问题“Spring事务失败回滚”。我有一个服务类,它调用2 DAO将数据插入到数据库表中。 我的事务配置: 我的服务和dao定义如下:

  • 我们有一个Spring事务回滚问题,其中回滚似乎不起作用 在用注释的服务层方法中,我调用三个不同的类来插入3条记录 中间插入从第四个表执行get以填充描述字段,但此get失败。我希望第一次插入会回滚,但它似乎没有发生 几点: 获取方法抛出运行时异常 我们使用和中定义的。Bean是在中创建的,它被导入到 在层 中没有 注释 我们已经使用了

  • 我有Spring > 不应该失败主事务,在我的例子中是cteateSmth() 如果失败,应该回滚它自己的事务 service1.cteatsmth(); 在上面的例子中,即使尝试对cretePartA()进行捕获包装,整个cteateSmth()事务也将回滚。 我尝试使用REQUIRES_NEW来实现这一点,但在这种情况下似乎无法回滚cretePartA()操作。 我试图不为cretePartA

  • 这很好,但并不总是在代码中抛出运行时异常。因此,我挖掘并发现如下所示的rollbackFor; 现在,我必须更改所有代码,以使用RollBackfor更改@Transactional。但是还有其他方法可以将所有@transaction advice属性更改为rollbackFor=exception.class吗?