在做商城项目时,涉及到订单表orders和订单项表orderitem的数据同时插入到数据库,这两张表的关系为多对多,通过事物提交时会产生如下错误:
java.sql.SQLException: Duplicate entry 'D4E7B8F045EE4E8C8750A8EF64326A30' for key 'PRIMARY' Query: insert into orders values(?,?,?,?,?,?,?,?) Parameters: [D4E7B8F045EE4E8C8750A8EF64326A30, Thu Nov 30 20:19:29 CST 2017, 11686.0, 0, null, null, null, f55b7d3a352a4f0782c910b2c70f1ea4]
这个错误的意思是 java插入重复录入的4326a30 '关键'主'查询,也就是主键重复插入,网上的解决方法有以下几种:
一:在my.cnf的[mysqld]片段中加入设置innodb_autoinc_lock_mode=0
同一时候注意调大jdbc的活跃链接数,如设置 jdbc.maxActive=300,由于设置innodb_autoinc_lock_mode=0可能导致链接过多。
注意,这样的方式仅仅须要在并发性能测试时设置,由于这样的方式在插入记录时需进行全表锁定,性能较差,平时生产环境中仅仅需使用默认的设置innodb_autoinc_lock_mode=1就可以,mysql的官方文档有说明:
1、innodb_autoinc_lock_mode = 0 (“traditional” lock mode)
这样的方式就和mysql5.1.22曾经一样,这样的方式的特点就是“表级锁定”,并发性较差
2、innodb_autoinc_lock_mode = 1 (“consecutive” lock mode)
这样的方式是新版本号中的默认方式,推荐使用,并发性相对较高,特点是“consecutive”,即保证同一条insert语句中新插入的auto_increment id都是连续的。
二:清空表中的数据在插入
以上这两种方法试了没有成功,
我的解决方法:
到mysql官网上下载最新的jar包并替换项目原有的jar包
然后进行测试,成功插入数据到订单表orders和订单项表orderitem中