python多线程爬虫往mysql里面写数据导致死锁
PHP中文网
PHP中文网 2017-04-18 10:10:53
0
3
394

我在爬虫里面用的是MySQLdb这个包进行insert操作,我一开始是所有子线程公用一个mysql连接,结果发现数据写不进去,然后我又试过所有子线程公用一个cursor游标,出现了只有部分数据写进去了,而且自增id居然还自增了。(也就是数据没有写入进去,但是自增id的自增数增加了),最后我干脆每个子线程在每一次写入的时候创建一个连接句柄,然后就出现了如图症状,请问这该怎么办啊?有什么优化方法吗?

PHP中文网
PHP中文网

认证高级PHP讲师

모든 응답(3)
刘奇

초대해주셔서 감사합니다. MDL(메타데이터 잠금)은 5.5에서 mysql의 메타데이터 보호 메커니즘에 도입되었습니다. 5.5 메타데이터 보호는 트랜잭션 수준에서 이루어지며 MDL은 트랜잭션이 끝난 후에만 해제됩니다.
한 세션이 기본 데이터베이스에서 DML 작업을 수행하고 아직 제출하지 않은 경우 다른 세션에서 동일한 객체에 대해 테이블 ​​삭제 등의 DDL 작업을 수행합니다. MySQL의 binlog는 트랜잭션 제출 순서에 따라 기록되므로 라이브러리에서 적용할 경우 테이블을 먼저 삭제한 후 테이블에 삽입하는 현상이 발생하여 라이브러리에서 적용 시 오류가 발생하게 됩니다. 따라서 MySQL은 버전 5.5.3부터 메타데이터 잠금을 도입했습니다. 메타데이터 잠금은 트랜잭션이 종료된 후에만 해제되므로 트랜잭션이 커밋되거나 롤백되기 전에는 DDL 작업을 수행할 수 없습니다.
테이블 메타데이터 잠금 대기의 원인은 일반적으로 다음과 같은 간단한 시나리오입니다.
시나리오 1: 긴 트랜잭션 실행, DDL 차단 및 동일한 테이블에서 모든 후속 작업 차단
시나리오 2: 트랜잭션이 제출되지 않아 DDL을 차단하고 동일한 테이블에서 모든 후속 작업을 차단합니다

그럼 어떻게 해결하나요?
대기 중인 차단 상태의 모든 트랜잭션 잠금 보기

으아아아 으아아아

또는 특정 테이블을 직접 타겟팅할 수도 있습니다

으아아아

해당 기록을 직접 삭제하면 잠금이 해제됩니다.

제안: 모든 스레드에 대한 연결을 공유하는 대신 연결 풀을 사용하고 각 트랜잭션을 커밋하거나 롤백하는 것을 기억하세요.
추천 참조:
https://dev.mysql.com/doc/ref...
http://www.cnblogs.com/cchust...
https://gold .xitu.io/entry/57...
http://www.cnblogs.com/digdee...

Peter_Zhu

표는 Innodb에서 가져온 것인데 자동 제출이 활성화되어 있지 않고 수동 제출도 없습니다.

黄舟

우선, 여러 스레드가 하나의 연결을 공유합니다. 이는 동시성과 동일합니다.
스레드당 하나의 연결의 활용률은 높지 않으므로 일반적으로 연결 풀입니다. 재활용이 필요 없으며 연결이 항상 유지되므로 빈번한 연결 끊김이 발생하지 않습니다.

사진과 함께 거래 개시 여부

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!