想必也有人遇到​​@Transactional​​​事务不起作用,当时我遇到这个问题也很懵逼,明明别人的代码跟自己的一样,为什么别人的​​@Transactional​​​事务起作用而自己的事务却没有起作用。如下举例子说明:
student1与student2要么全部录入成功,要么全部录入失败,但是我当时遇到的就是student1可以录入成录入功但是student2录入失败(故意把student2信息修改成录入错误的)。
​​​@Service​​​public class StudentService {
​@Autowired​​private StudentRespository studentRespository;

  1. ​@Transactional​
  2. ​public void insertTwo(){​
  3. ​ Student student1=new Student();​
  4. ​ student1.setName("n");​
  5. ​ student1.setAge(20);​
  6. ​ student1.setSex("nv");​
  7. ​ studentRespository.save(student1);​

  8. ​ Student student2=new Student();​
  9. ​ student2.setName("name2");​
  10. ​ student2.setAge(20);​
  11. ​ student2.setSex("nan");​
  12. ​ studentRespository.save(student2);​
  13. ​}​

}
经过一番折腾最后找到了原因,是因为数据库不支持事务,如果遇到这个问题首先去看看数据库是否支持事务管理。MySql举例子:Mysql修改支持事务的方法,

@Transactional事务不起作用原因_mysql

把引擎(也就是表类型)修改为InnoDB就ok了,在进行测试,事务起作用了。

下面方法供大家参考,楼主并未进行验证。
方案一:手动回滚。给注解加上参数如:​​​@Transactional​​​(rollbackFor=Exception.class)
方案二:如上述分析。MyException改为继承RuntimeException的异常。并且在service上层要继续捕获这个异常并处理
方案三:在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常