@Transactional事务不起作用原因

Posted ming-blogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@Transactional事务不起作用原因相关的知识,希望对你有一定的参考价值。

想必也有人遇到@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修改支持事务的方法,

技术分享图片

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

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

 










以上是关于@Transactional事务不起作用原因的主要内容,如果未能解决你的问题,请参考以下文章

事务注解@Transactional不起作用

导致spring事务配置不起作用的一种原因

Spring @Transactional注解不回滚不起作用无效

具有@async超时值的Spring @transactional不起作用

Spring 声明式事务@Transactional不起作用,为啥

@Transactional 注意事项方法调用