mysql主键设置成auto_increment时,进⾏并发性能测试出现
主键重复Dupli。。。
mysql主键设置成auto_increment时,进⾏并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'
解决⽅法:
在myf的[mysqld]⽚段中添加设置innodb_autoinc_lock_mode=0
同时注意调⼤jdbc的活跃链接数,如设置 jdbc.maxActive=300,因为设置innodb_autoinc_lock_mode=0可能导致链接过多。
注意,这种⽅式只需要在并发性能测试时设置,因为这种⽅式在插⼊记录时需进⾏全表锁定,性能较差,平时⽣产环境中只需使⽤默认的设
置innodb_autoinc_lock_mode=1即可,mysql的官⽅⽂档有说明:
mysql操作官方文档innodb_autoinc_lock_mode属性的含义如下:
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都是连续的。
这种模式下:
“Simple inserts”:直接通过分析语句,获得要插⼊的数量,然后⼀次性分配⾜够的auto_increment id,
只会将整个分配的过程锁住。
“Bulk inserts”:因为不能确定插⼊的数量,因此使⽤和以前的模式相同的表级锁定。
“Mixed-mode inserts”:直接分析语句,获得最坏情况下需要插⼊的数量,然后⼀次性分配⾜够的auto_increment id,只会将整个分配的过程锁住。需要注意的是,这种⽅式下,会分配过多的id,⽽导致”浪费“。⽐如INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');会⼀次性的分配5个id,⽽不管⽤户是否指定了部分id;INSERT … ON DUPLICATE KEY UPDATE⼀次性分配,⽽不管将来插⼊过程中是否会因为duplicate key⽽仅仅执⾏update操作。
注意:当master mysql版本<5.1.22,slave mysql版本>=5.1.22时,slave需要将innodb_autoinc_lock_mode设置为0,因为默认的 innodb_autoinc_lock_mode为1,对于INSERT … ON DUPLICATE KEY UPDATE和INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');的执⾏结果不同,现实环境⼀般会使⽤INSERT … ON DUPLICATE KEY UPDATE。
3、innodb_autoinc_lock_mode = 2 (“interleaved” lock mode)
这种模式是来⼀个分配⼀个,⽽不会锁表,只会锁住分配id的过程,和innodb_autoinc_lock_mode = 1的区别在于,不会预分配多个,这种⽅式并发性最⾼。但是在replication中当binlog_format为stateme
nt-based时 (简称SBR statement-based replication)存在问题,因为是来⼀个分配⼀个,这样当并发执⾏时,“Bulk inserts”在分配的时会同时向其他的INSERT分配,会出现主从不⼀致(从库执⾏结果和主库执⾏结果不⼀样),因为binlog只会记录开始的 insert id。
参考⽂档:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论