@Transactional 注解在 springboot 中对于多个子类不起作用

问题描述 投票:0回答:1

我试图在同一事务下的多个类中保留多个数据库调用。

EX: 家长班(服务1)

@Service
@Slf4j
@RequiredArgsConstructor
public class Processor {
  private final StudentHandler studentHandler;

  private final TeacherHandler teacherHandler;

@Transactional(rollbackFor = {CustomException.class})
public void execute(MessageObj msg) {
//calling handler one

studentHandler.process(msg);


//calling handler two

teacherHandler.process(msg);
}
}

处理程序类1的代码

@Service
@Slf4j
@RequiredArgsConstructor
public class StudnetHandler {

private final StudnetDao studentDao;

@Transactional(rollbackFor = {CustomException.class})
public void process(MessageObj obj){

studentDao.saveStudent(obj);


}

}

处理程序类2的代码

@Service
@Slf4j
@RequiredArgsConstructor
public class TeacherHandler {

private final TeacherDao teacherDao;

@Transactional(rollbackFor = {CustomException.class})
public void process(MessageObj obj){

teacherDao.saveTeacher(obj);


}

}

**学员道课**

@Repository
@RequiredArgsConstructor
@Slf4j
public class StudentDao {

private final JdbcTemplate jdbcTemplate;

@Transactional(rollbackFor = {CustomException.class})
public void saveStudent(MessageObj obj){

jdbcTemplate.save("student_query",obj);

jdbcTemplate.save("audit_query",obj);

}

}

**师道课**

@Repository
@RequiredArgsConstructor
@Slf4j
public class TeacherDao {

private final JdbcTemplate jdbcTemplate;

@Transactional(rollbackFor = {CustomException.class})
public void saveTeacher(MessageObj obj){

jdbcTemplate.save("student_query",obj);


}

}

在上面的代码中,如果任何查询(老师,学生)中出现customException,我希望回滚所有查询。

在测试时,我可以看到在teacherhandler中是否出现异常,只有teacherDao查询正在回滚,但学生查询没有回滚。

如果教师处理程序中出现异常,如果我也想回滚学生查询,有人可以帮忙做什么吗?

注: 请忽略语法错误。预先感谢。

spring spring-boot spring-data-jpa spring-data spring-transactions
1个回答
0
投票

您已在两个处理程序类上放置@trasactional,因此它将为两者创建一个单独的事务,因此例如,如果在teacherhandler中发生异常,则teacherdao中的查询只会回滚,而studenthandler事务如果已完成且没有问题,则将成功提交,要解决这些问题(如果其中任何一个发生异常,所有查询都将回滚),请将@transaction放在处理器类中的执行方法上,并从studenthandler和teacherhandler类中删除@transaction。这样两个处理程序都将处于单个事务下。

© www.soinside.com 2019 - 2024. All rights reserved.