一、異常捕獲的原因
- 這里Exception異常,他又分為運行時異常RuntimeException和非運行時異常
- 可查的異常(checked exceptions):Exception下除了RuntimeException外的異常
- 不可查的異常(unchecked exceptions):RuntimeException及其子類和錯誤(Error)
- 異常checked例外也回滾:在整個方法前加上 @Transactional(rollbackFor=Exception.class)
- 異常unchecked例外不回滾: @Transactional(notRollbackFor=RunTimeException.class)
- 如果異常被try{}catch{}了,事務就不回滾了,如果想讓事務回滾必須再往外拋try{}catch{throw Exception}
二、數據庫引擎不支持回滾(使用MYSQL就很可能是這個原因)
- Mysql數據庫有兩種引擎,注意要使用支持事務的引擎,比如innodb,如果是MyISAM,事務是不起作用的。
- 使用springboot的jpa自動創建庫表的時候,默認使用MyISAM引擎,可以檢查庫表查看引擎。
- 修改配置:
spring: jpa: hibernate: ddl-auto: update naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #按字段名字建表 show-sql: true database: mysql database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #使用innodb引擎建表