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<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PHN0cm9uZz5pbm5vZGJfYXV0b2luY19sb2NrX21vZGXK9NDUtcS6rNLlyOfPwqO6PC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPjGhomlubm9kYl9hdXRvaW5jX2xvY2tfbW9kZSA9IDAgKKGwdHJhZGl0aW9uYWyhsSBsb2NrIG1vZGUpPC9zdHJvbmc+PGJyPgrV4tbWt73Kvb7Nus1teXNxbDUuMS4yMtLUx7DSu9H5o6zV4tbWt73KvbXEzNi1477NysehsLHtvLbL+LaoobGjrLKit6LQ1L3Psu48L3A+CjxwPjxicj4KPHN0cm9uZz4yoaJpbm5vZGJfYXV0b2luY19sb2NrX21vZGUgPSAxICihsGNvbnNlY3V0aXZlobEgbG9jayBtb2RlKTwvc3Ryb25nPjxicj4K1eLW1re9yr3Kx9DCsOaxvtbQtcTErMjPt73KvaOszca89sq508OjrLKit6LQ1M/gttS9z7jfo6zM2LXjysehsGNvbnNlY3V0aXZlobGjrLy0saPWpM2s0rvM9Wluc2VydNPvvuTW0NDCsuXI67XEYXV0b19pbmNyZW1lbnQgaWS2vMrHwazQ+LXEoaM8YnI+CtXi1tbEo8q9z8Kjujxicj4KobBTaW1wbGUgaW5zZXJ0c6Gxo7rWsb3Tzai5/bfWzvbT777ko6y78bXD0qqy5cjrtcTK/cG/o6zIu7rz0ru0ztDUt9bF5Nfjubu1xGF1dG9faW5jcmVtZW50IGlko6zWu7vhvavV+7j2t9bF5LXEuf2zzMv416Ghozxicj4KobBCdWxrIGluc2VydHOhsaO60vLOqrK7xNzIt7aosuXI67XEyv3Bv6Os0vK0y8q508O6zdLUx7C1xMSjyr3P4M2stcSx7by2y/i2qKGjPGJyPgqhsE1peGVkLW1vZGUgaW5zZXJ0c6Gxo7rWsb3Tt9bO9tPvvuSjrLvxtcPX7ru1x+m/9s/C0OjSqrLlyOu1xMr9wb+jrMi7uvPSu7TO0NS31sXk1+O5u7XEYXV0b19pbmNyZW1lbnQgaWSjrNa7u+G9q9X7uPa31sXktcS5/bPMy/jXoaGj0OjSqtei0uK1xMrHo6zV4tbWt73Kvc/Co6y74bfWxeS5/bbgtcRpZKOstvi1vNbCobHAy7fRobCho7HIyOdJTlNFUlQgSU5UTyB0MSAoYzEsYzIpIFZBTFVFUyAoMSyhr2E="), (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