我试图在同一事务下的多个类中保留多个数据库调用。
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查询正在回滚,但学生查询没有回滚。
如果教师处理程序中出现异常,如果我也想回滚学生查询,有人可以帮忙做什么吗?
注: 请忽略语法错误。预先感谢。
您已在两个处理程序类上放置@trasactional,因此它将为两者创建一个单独的事务,因此例如,如果在teacherhandler中发生异常,则teacherdao中的查询只会回滚,而studenthandler事务如果已完成且没有问题,则将成功提交,要解决这些问题(如果其中任何一个发生异常,所有查询都将回滚),请将@transaction放在处理器类中的执行方法上,并从studenthandler和teacherhandler类中删除@transaction。这样两个处理程序都将处于单个事务下。