你能告诉我如何只对某些代码块运行事务吗?我有@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的答案,得到了这个错误:
您可以在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吗?