@Transactional事务不起作用原因
Posted ming-blogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@Transactional事务不起作用原因相关的知识,希望对你有一定的参考价值。
想必也有人遇到@Transactional事务不起作用,当时我遇到这个问题也很懵逼,明明别人的代码跟自己的一样,为什么别人的@Transactional事务起作用而自己的事务却没有起作用。如下举例子说明:
student1与student2要么全部录入成功,要么全部录入失败,但是我当时遇到的就是student1可以录入成录入功但是student2录入失败(故意把student2信息修改成录入错误的)。
@Service
public class StudentService {
@Autowired
private StudentRespository studentRespository;
@Transactional
public void insertTwo(){
Student student1=new Student();
student1.setName("n");
student1.setAge(20);
student1.setSex("nv");
studentRespository.save(student1);
Student student2=new Student();
student2.setName("name2");
student2.setAge(20);
student2.setSex("nan");
studentRespository.save(student2);
}
}
经过一番折腾最后找到了原因,是因为数据库不支持事务,如果遇到这个问题首先去看看数据库是否支持事务管理。mysql举例子:Mysql修改支持事务的方法,
把引擎(也就是表类型)修改为InnoDB就ok了,在进行测试,事务起作用了。
下面方法供大家参考,楼主并未进行验证。
方案一:手动回滚。给注解加上参数如:@Transactional(rollbackFor=Exception.class)
方案二:如上述分析。MyException改为继承RuntimeException的异常。并且在service上层要继续捕获这个异常并处理
方案三:在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常
以上是关于@Transactional事务不起作用原因的主要内容,如果未能解决你的问题,请参考以下文章
Spring @Transactional注解不回滚不起作用无效
具有@async超时值的Spring @transactional不起作用