mysql表類型導致的 setRollbackOnly() 事務不回滾


在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

 


免責聲明!

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



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