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

对于spring-batch事务在异常后不会回滚

卢黎昕
2023-03-14
public class MyWriter{

@Autowired
private MyService myService;

@Override
public void write(List<? extends MyBO> list) {
  try{
    for(MyBO bo: list){
      myService.insert(bo);
    }
  }
  catch(Exception e){
    log.error("Cant write to DB")
  }
}


public class MyService{
@Autowired
private TableOneDAO tableOneDao;

@Autowired
private TableTwoDAO tableTwoDAO;

@Autowired
private TableThreeDAO tableThreeDAO;

public void insert(MyBO bo){
  try{
      // do other stuff of processing bo and create entity
      MyEntityTableOne myentity1 = getEntityT1(bo);
      MyEntityTableTwo myentity2 = getEntityT2(bo);
      MyEntityTableThree myentity3 = getEntityT3(bo);
      insertToDB(myEntity1,myEntity2,myEntity3);
  }
  catch(Exception e){
    log.error("Error occured.");
    throw new MyException("Error Blah blah occured");
  }
}

@Transactional(value = "txn1")
public void insertToDB(MyEntityTableOne entity1, MyEntityTableTwo entity2, MyEntityTableThree entity3) {
  try{
    tableOneDao.insert(entity1);
    tableTwoDAO.insert(entity2);
    tableThreeDAO.insert(entity3);
  }
  catch(Exception e){
    log.error("Error occured during insert to DB");
    throw new MyException("Error Blah blah occured during DB insert");
  }
}

共有1个答案

任昊阳
2023-03-14

我试图让它变得简单:为了支持@transactional,spring将实现类包装成一个所谓的代理,并用事务性逻辑围绕方法call/class。

现在您正在同一个类中调用带注释的@transactional方法。因此,代理不被调用,事务不起作用。当将注释移动到insert方法时,您正在从类的外部调用该方法,这意味着您将针对代理调用该方法。

这是Spring AOP的一个限制(?)我想。

public class MyService{
@Ressource
private MyService self;

...

self.insertToDB(myEntity1,myEntity2,myEntity3)
 类似资料:
  • 我正在使用Spring JpaRepository在我的一个应用程序屏幕中实现CRUD。作为其中的一部分,我正在开发一个功能,用户可以保存所有汽车实体或没有(应该回滚)到数据库。我不确定如何使用Spring Boot、Spring Rest和Spring JPA实现此功能。 下面是我的源代码。 除此之外,我还得到了一个类似 请帮帮我。谢谢你。

  • 在上面的代码中,我将hibernate与mysql一起使用,hibernate会话由SpringSessionContext管理(在事务边界下使用SessionFactory.CurrentSession类) 下面的镜像(dao层)是直接的用例,但是异常没有回滚,我从简单的服务层调用这个方法(即服务层调用dao层进行CRUD操作),我了解了spring在事务管理上的代理机制,在这种情况下,下面的镜

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

  • 问题内容: 我在下面使用HIbernate和Spring和JPA。当引发PersistenceException时,我想捕获它并返回错误消息,以便它不会传播到调用者。 但是我得到一个异常,说我需要在异常之后回滚事务,但是当我捕获到异常并且不想重新抛出该异常时,如何回滚它呢? 问题答案: 似乎没有办法回退由Spring ORM管理的失败事务。问题中显示的代码是服务类。将其持久性例程提取到单独的DAO

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

  • 如果我没有捕捉到运行时异常,我就不会得到hibernate异常(不要刷新会话..)