2017-01-29 15 views
0

У меня есть проект, в который я вставляю много, если информация в таблицу с автоматическим добавочным первичным ключом в секунду, и делайте это с помощью многопоточности, что означает, что существует много потоков, которые пытаются вставить новая строка для этой таблицы. Поскольку есть блокировка на столе для вставленных запросов, я не могу выполнять вставки одновременно, и поэтому я не могу получить максимальную производительность от потоков ...MySql innoDB auto инкременты блокировки обход

Есть ли способ преодолеть эту блокировку?

+0

Сколько вставляет/в среднем? Максимум? Как часто возникает проблема с блокировкой? –

ответ

1

Вы можете установить innodb_autoinc_lock_mode в 1 в my.cnf. Тогда нет LOCK для Auto_increment. Тогда вполне возможно, что у вас есть дыры в значениях, если один THEAD откатить пробу см

MariaDB [test]> show variables like 'innodb_autoinc_lock_mode'; 
+--------------------------+-------+ 
| Variable_name   | Value | 
+--------------------------+-------+ 
| innodb_autoinc_lock_mode | 1  | 
+--------------------------+-------+ 
1 row in set (0.00 sec) 

образец 1

MariaDB [test]> start transaction; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [test]> insert into autoinc VALUES(NULL,'hello'); 
Query OK, 1 row affected (0.01 sec) 



thread 2 ------------------> MariaDB [test]> start transaction; 
thread 2 ------------------> Query OK, 0 rows affected (0.00 sec) 

thread 2 ------------------> MariaDB [test]> insert into autoinc VALUES(NULL,'world'); 
thread 2 ------------------> Query OK, 1 row affected (0.00 sec) 

thread 2 ------------------> MariaDB [test]> commit; 
thread 2 ------------------> Query OK, 0 rows affected (0.00 sec) 

thread 2 ------------------> MariaDB [test]> 


MariaDB [test]> commit; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [test]> select * from autoinc; 
+----+-------+ 
| id | d  | 
+----+-------+ 
| 1 | hello | 
| 2 | world | 
+----+-------+ 
2 rows in set (0.00 sec) 

MariaDB [test]> 

образец 2 с откатом

MariaDB [test]> start transaction; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [test]> insert into autoinc VALUES(NULL,'Guten'); 
Query OK, 1 row affected (0.00 sec) 

thread 2 ------------------> MariaDB [test]> start transaction; 
thread 2 ------------------> Query OK, 0 rows affected (0.00 sec) 

thread 2 ------------------> MariaDB [test]> insert into autoinc VALUES(NULL,'Tag'); 
thread 2 ------------------> Query OK, 1 row affected (0.00 sec) 

thread 2 ------------------> MariaDB [test]> commit; 
thread 2 ------------------> Query OK, 0 rows affected (0.01 sec) 

MariaDB [test]> rollback; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [test]> select * from autoinc; 
+----+-------+ 
| id | d  | 
+----+-------+ 
| 1 | hello | 
| 2 | world | 
| 4 | Tag | 
+----+-------+ 
3 rows in set (0.00 sec) 

MariaDB [test]> 
+0

Но если я точно знаю, что как только я вставляю строку, я не хочу откатываться, кроме как в случае отказа db, который, как я предполагаю, не предполагает, что это происходит очень часто, тогда не очень плохая практика установить блокировку на 1 и я могу предположить, что количество отверстий будет очень низким, не так ли? – kitsuneFox

+0

правильно, но сначала посмотрите, какие ** показывают переменные типа «innodb_autoinc_lock_mode»; ** говорит. значение по умолчанию равно 1. см. https://mariadb.com/kb/en/mariadb/xtradbinnodb-server-system-variables/#innodb_autoinc_lock_mode –

+0

Я буду, но я знаю, что есть блокировка, потому что, когда я пытаюсь вставлять cnncorently I получить исключение Sql, которое говорит, что не может получить блокировку ... – kitsuneFox

 Смежные вопросы

  • Нет связанных вопросов^_^