@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();語句,手動回滾,這樣上層就無需去處理異常

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM