Java For spring批处理事务在异常后未回滚
我正在处理spring批处理,在读卡器和处理器之后,writer负责将数据填充到DB。编写器正在调用服务,该服务在内部调用DAO层。在insertToDB()方法中,如果发生异常,则不会回滚事务。我的密码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
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(?)的一个限制。希望它能有所帮助。