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

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

PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(3)
刘奇

Terima kasih atas jemputan. Metadata Lock (MDL) telah diperkenalkan ke dalam mekanisme perlindungan metadata mysql dalam 5.5. 5.5 Perlindungan metadata berada pada tahap transaksi, dan MDL dikeluarkan hanya selepas transaksi tamat.
Apabila sesi melakukan operasi DML dalam pangkalan data utama dan belum diserahkan, sesi lain melakukan operasi DDL seperti drop table pada objek yang sama Memandangkan binlog MySQL direkodkan berdasarkan susunan penyerahan transaksi, jadi dalam Apabila memohon dari perpustakaan, akan berlaku situasi di mana jadual dijatuhkan dahulu dan kemudian dimasukkan ke dalam jadual, menyebabkan ralat dalam aplikasi dari perpustakaan. Oleh itu, MySQL memperkenalkan kunci Metadata selepas versi 5.5.3 Kunci Metadata hanya akan dikeluarkan selepas urus niaga tamat, jadi operasi DDL tidak boleh dilakukan sebelum transaksi dilakukan atau ditarik balik.
Punca Menunggu kunci metadata jadual biasanya adalah senario mudah berikut:
Senario 1: Transaksi lama berjalan, menyekat DDL dan kemudian menyekat semua operasi berikutnya pada jadual yang sama
Senario 2 : Urus niaga tidak diserahkan, menyekat DDL dan kemudian menyekat semua operasi seterusnya pada jadual yang sama

Jadi bagaimana untuk menyelesaikannya?
Lihat semua kunci transaksi dalam keadaan menunggu disekat

USE INFORMATION_SCHEMA
SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

Atau anda boleh menyasarkan jadual tertentu secara langsung

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Memadamkan rekod yang berkaitan secara langsung akan membuka kunci kunci.

Cadangan: Gunakan kumpulan sambungan dan bukannya berkongsi sambungan untuk semua urutan dan ingat untuk melakukan atau tarik balik setiap transaksi.
Rujukan yang disyorkan:
https://dev.mysql.com/doc/ref...
http://www.cnblogs.com/cchust...
https://gold .xitu.io/entry/57...
http://www.cnblogs.com/digdee...

Peter_Zhu

Jadual adalah daripada Innodb, tetapi penyerahan automatik tidak didayakan dan tiada penyerahan manual.

黄舟

Pertama sekali, beberapa utas berkongsi satu sambungan, yang bersamaan dengan concurrency Banyak utas perlu menunggu.
Kadar penggunaan satu sambungan bagi setiap utas tidak tinggi, jadi ia biasanya merupakan kumpulan sambungan. Tidak perlu untuk mengitar semula, dan sambungan sentiasa dikekalkan, mengelakkan sambungan terputus yang kerap.

Dengan gambar, sama ada subjek telah membuka transaksi

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!