想必也有人遇到@Transactional事務不起作用,當時我遇到這個問題也很懵逼,明明別人的代碼跟自己的一樣,為什么別人的@Transactional事務起作用而自己的事務卻沒有起作用。如下舉例子說明:
student1與student2要么全部錄入成功,要么全部錄入失敗,但是我當時遇到的就是student1可以錄入成錄入功但是student2錄入失敗(故意把student2信息修改成錄入錯誤的)。
@Service
public class StudentService {
@Autowired
private StudentRespository studentRespository;
@Transactionalpublic 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();語句,手動回滾,這樣上層就無需去處理異常
