Java For spring批处理事务在异常后未回滚

Java For spring批处理事务在异常后未回滚,java,spring,spring-batch,spring-transactions,rollback,Java,Spring,Spring Batch,Spring Transactions,Rollback,我正在处理spring批处理,在读卡器和处理器之后,writer负责将数据填充到DB。编写器正在调用服务,该服务在内部调用DAO层。在insertToDB()方法中,如果发生异常,则不会回滚事务。我的密码 public class MyWriter{ @Autowired private MyService myService; @Override public void write(List<? extends MyBO> list) { try{ for(MyBO

我正在处理spring批处理,在读卡器和处理器之后,writer负责将数据填充到DB。编写器正在调用服务,该服务在内部调用DAO层。在insertToDB()方法中,如果发生异常,则不会回滚事务。我的密码

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");
  }
}
公共类MyWriter{
@自动连线
私人MyService-MyService;
@凌驾

public void write(List我试图让它变得简单:为了支持
@Transactional
spring将实现类包装成一个所谓的代理,并用事务逻辑包围方法调用/类

现在,您正在同一个类中调用
@Transactional
带注释的方法。因此,代理不会被调用,事务性方法也不会工作。当将注释移动到
插入
方法时,您是在类外部调用该方法,这意味着您针对pr调用了该方法氧气

我认为这是春季AOP(?)的一个限制

您可以执行以下操作以实现您的目标:

public class MyService{
@Ressource
private MyService self;

...

self.insertToDB(myEntity1,myEntity2,myEntity3)

您的项目编写器将在Spring Batch驱动的事务中被调用,您可以通过提供事务管理器和事务属性在步骤级别进行配置。因此,不需要在编写器使用的下游服务中使用
@Transactional


您需要从
MyService
中删除该注释,它应该可以正常工作。

我试图让它变得简单:为了支持
@Transactional
,spring将实现类包装到一个所谓的代理中,并用事务逻辑包围方法调用/类。现在您正在调用
@Transactional
同一个类中的带注释的方法。因此代理不被调用,事务性方法不工作。当移动到
insert
时,您是从类外部调用方法,这意味着您针对代理调用方法。我认为这是Spring AOP(?)的一个限制。希望它能有所帮助。