mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry ‘xxx‘ for key ‘PRIMARY‘

解决方法:

在my.cnf的[mysqld]片段中添加设置innodb_autoinc_lock_mode=0

同时注意调大jdbc的活跃链接数,如设置 jdbc.maxActive=300,因为设置innodb_autoinc_lock_mode=0可能导致链接过多。

注意,这种方式只需要在并发性能测试时设置,因为这种方式在插入记录时需进行全表锁定,性能较差,平时生产环境中只需使用默认的设置innodb_autoinc_lock_mode=1即可,mysql的官方文档有说明:

http://dev.mysql.com/doc/refman/5.6/en/innodb-auto-increment-configurable.html

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为statement-based时 (简称SBR statement-based replication)存在问题,因为是来一个分配一个,这样当并发执行时,“Bulk inserts”在分配的时会同时向其他的INSERT分配,会出现主从不一致(从库执行结果和主库执行结果不一样),因为binlog只会记录开始的
insert id。

参考文档:

http://biancheng.dnbcw.info/mysql/356243.html

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'

时间: 2024-10-03 13:39:58

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'的相关文章

sql语句插入时提示:“Duplicate entry &#39;XXX&#39; for key 1 ” 是什么原因?

你用的是MYSQL 数据库吧? 1:提示信息翻译:插入 xxx 使索引1重复分析:索引如果是primary unique这两两种,那么数据表的数据对应的这个字段就必须保证其每条记录的唯一性.否则就会产生这个错误.一般发生在对数据库写操作的时候,例如Discuz!4.1论坛程序要求所有会员的用户名username必须唯一,即username 的索引是unique,这时如果强行往cdb_members表里插入一个已有的username的记录就会发上这个错误,或者将一条记录的username更新为已有

ERROR 1130: Host &#39;192.168.1.3&#39; is not allowed to connect to this MySQL ERROR 1062 (23000): Duplicate entry &#39;%-root&#39; for key &#39;PRIMARY&#39;

use mysql mysql> select host, user from user; 将相应用户数据表中的host字段改成'%': update user set host='%' where user='root'; ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY' 不予理会 flush privileges; 重新远程连接OK ERROR 1130: Host '192.168.1.3' is not allo

mysql Duplicate entry &#39;9223372036854775807&#39; for key &#39;PRIMARY&#39;

mysql插入数据报错提示: ERROR 1062(23000) Duplicate entry  '9223372036854775807' for key 'PRIMARY' 发现问题果断 直接 把字段改成无符号的类型UNSIGNED 7.BIGINT[(M)] [UNSIGNED] [ZEROFILL] M默认为20 大整数.带符号的范围是-9223372036854775808到9223372036854775807.无符号的范围是0到18446744073709551615. 提示:这

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry &#39;qingmu&#39; for key &#39;PRIMARY&#39;

### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'qingmu' for key 'PRIMARY' ### The error may involve com.qingmu2.core.dao.seller.SellerDao.insertSelective-Inline ### The

Tomcat设置成NIO时,使用的线程池

设置成NIO时, <Connector port="8088" protocol="org.apache.coyote.http11.Http11NioProtocol" ... maxThreads属性是没用的,因为默认使用的是NIO的线程池,除非你使用了executor属性,设置了特定的线程池 本人已进行过测试,使用Http11NioProtocol,同时将maxThreads设成200,让后进行1000个并发请求,仍然可以通过 正常情况下,设置成http

mysql插入数据报错IntegrityError: (1062, &quot;Duplicate entry &#39;xx&#39; for key &#39;xxxxx&#39;&quot;)

1.问题描述 MySQL插入数据的时候报错,提示如下: IntegrityError: (1062, "Duplicate entry 'xx' for key 'xxxxx'")2.问题分析 根据错误提示我们可以大致得到以下信息: 1.IntegrityError表示这个字段在MySQL中的类型为:整型. 2.Duplicate Entry:“Duplicate”——something that is an exact copy  of something else.所以这句话的意思

遇到的错误:Mysql 报错Duplicate entry &#39;值&#39; for key &#39;字段名&#39;的解决

### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'admin' for key 'user_name_unique' ### The error may involve com.mmall.dao.UserMapper.insert-Inline ### The error occurred

静态ip设置成dhcp------同时------解决error: no valid active connections found

问题描述: 正常的网络连接是: 当网络设置错误后,不管连接有线或者是无线,该图标都是无信号的. 解决方案: 参考方法: 1)http://blog.sina.com.cn/s/blog_74b0186301017jh7.html 2)http://blog.csdn.net/qq_26093511/article/details/50599839 主要是参考第一个. 涉及到第一个文件: /etc/network/interfaces 修改后文件如下: 涉及到第二个文件: /etc/Network

mysql数据库编码设置成utf-8,避免出现乱码

设置默认编码为utf8:set names utf8;设置数据库db_name默认为utf8:ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;设置表tb_name默认编码为utf8:ALTER TABLE `tb_name`        DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;