这是因为多线程共享了同一个数据库连接,但每个execute前没有加上互斥锁,解决方法如下:

方法一:每个execute前加上互斥锁

lock.acquire()
cursor.execute(command,data)
lock.release()

方法二:
每个线程拥有自己的数据库连接,即在线程调用函数中加上数据库连接代码

方法三:
所有线程共用一个连接池,需要考虑线程总数和连接池连接数上限的问题

这里我使用的是方法二,因为这样效率最高不用等待其他的线程执行完,实际上只需要把db和cur的全局变量名改为函数内的变量名即可。

Code

# -*- coding: UTF-8 -*-
from querydata1 import queryData1
from querydata2 import queryData2
import threading
import pymysql

def getData():    

    def app(dicts):
        db = pymysql.connect("127.0.0.1","root","root#admin","test")
        cursor = db.cursor()

        def insertData(keyy,values):
            sql = "INSERT INTO test(keyy, value) VALUES ('{keyy}', '{value}');".format(keyy=keyy,value=values)
            try:            
                cursor.execute(sql)
                db.commit()        
            except Exception as e:            
                print(e)            
                db.rollback()

        for key in dicts:            
            insertData(key,dicts[key])

        db.close()

    dicts1 = queryData1()
    dicts2 = queryData2()
    
    ta = threading.Thread(target=app,kwargs={'dicts':dicts1})
    tb = threading.Thread(target=app,kwargs={'dicts':dicts2})

    ta.start()
    tb.start()    

if __name__ == "__main__":
    getData()

参考资料:
PyMysql 在多线程下的问题
pymysql多线程读写数据库报错:Packet sequence number wrong

标签: none

评论已关闭