2017-01-29 2 views
0

나는 자동 삽입 기본 키가있는 테이블에 정보가 많이 삽입되는 프로젝트를 가지고 있으며 다중 스레드를 사용하여 삽입을 시도하는 스레드가 많다는 것을 의미합니다 그 테이블의 새로운 행. 삽입 쿼리에 대해 테이블 ​​잠금이 있기 때문에 삽입을 동시에 수행 할 수 없기 때문에 스레드에서 최대 성능을 얻을 수 없습니다.MySQL innoDB 자동 증가 잠금 해결 방법

이 잠금을 극복 할 수있는 방법이 있습니까?

+0

얼마나 많은 THEAD 경우에 가능하다 평균/초 삽입? 최고? 얼마나 자주 잠금 문제가 발생합니까? –

답변

1

mychnf에서 innodb_autoinc_lock_mode을 1로 설정할 수 있습니다. 그러면 Auto_increment에 대한 LOCK이 없습니다. 그런 다음 당신이 값에 구멍을 가지고 하나가 참조 샘플을 롤백

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

cunncorently를 삽입하려고 할 때 잠금이 있다는 것을 알지만 알겠습니다. 잠금을 얻을 수 없다는 SQL 예외가 발생합니다 ... – kitsuneFox