软件环境:
SpringBoot 2.x,JPA(Hibernate),Mysql
概述:
系统框架从之前的SpringCloud 1.5.8 版本,生成新的SpringBoot工程,调整版本为2.1.1。配置了2个数据源,Mysql和Oracle,并将Mysql配置为Primary数据源,这样JPA框架会使用Mysql的数据源。
Oracle是第三方系统数据源,用于同步第三方基础数据。Oracle数据源使用Apache的commons-dbutils工具包操作读取数据。
翻车现场:
有一天同事说操作失败了,异常提示信息也提示到前台,为何数据一直在增长(多表插入)……
问题排查:
1、抛出的异常检查:确定是Runtime异常,因为是系统统一定的基类异常就是继承的Runtime异常。
2、怕是多数据源影响,于是又明确配置了事务为Mysql的数据源(注:因为Mysql为主数据源,所以JPA默认使用的是Mysql数据源,事务都是默认的,未显示配置)。然并卵……
3、只能跟进源码啦
从接口:PlatformTransactionManager入手
DEBUG框架确实也调用了事务的获取,失败也做了rollback。然而问题照旧~~~
4、最终百度到一篇说Mysql数据库的引擎可能不是Innodb引擎。赶紧看一下数据库,mmp,原来问题在这里。数据库表引擎全是MyIsam,Mysql的MyIsam引擎是不支持事务的,改成Innodb引擎,解决问题!
问题总结:
因为做系统设计的时候,为了省事,没有做数据库建表语句;而是直接设计实体对象,使用JPA注解定义好表结构,让JPA框架自动建表,结果全部给建成了MyIsam引擎的表。
1、SpringBoot可以在application.xml中修改策略:
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
2、手动建表,就不会有这个问题了
跟数据库也不陌生了,玩过多种数据库。特别我还是做了3年左右的Sybase数据库开发,给大公司做过Sybase数据库优化。今天却栽在了Mysql手里。
再恶补一下Mysql的数据库引擎吧,这里就不赘述了,有兴趣的同学自行百度Mysql的各种引擎的优缺点。