SpringBoot設置 @Transactional ,並在異常處理中調用setRollbackOnly()事務不回滾
阿新 • • 發佈:2017-10-18
不回 代碼 return exc ret spa clas 存儲引擎 myisam
在SpringBoot 中,使用事務非常簡單,只需在方法上面加入 @Transactional 註解就可以實現。也可加在類上,此時則類中所有方法都支持事務。
而當我使用下面代碼時,發現事務卻沒有回滾,異常之前的數據仍然插入了數據庫
@Transactional @RequestMapping(value="/create", method=RequestMethod.POST) public Resp createUser(String name, String phone, String password){ try {//... } catch (Exception e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //... return Resp.error(Resp.ErrorCode.USER_CREATE, null); } return Resp.success(); }
在各種嘗試之後,最後發現是mysql中的表類型是MyISAM,而MyISAM存儲引擎的一個特點就是不支持事務
解決方法:
之前在配置文件中的設置(使用的默認的存儲引擎)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
修改為(指定為InnoDB)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
SpringBoot設置 @Transactional ,並在異常處理中調用setRollbackOnly()事務不回滾