我试图从一个数据库中获取日期并插入另一个数据库中。尝试更新后,我的函数挂断,并导致错误提示:“超出了锁定等待超时;尝试重新启动事务”。这是因为打开了多个游标,我可能如何解决它。

soc = MySQLdb.connect(foobarparams)

db = MySQLdb.connect(foobarparams)

def getallinfo(self):
    cursor = soc.cursor(MySQLdb.cursors.DictCursor)
    cursor.execute('SELECT * FROM firm_contributor')
    result = cursor.fetchall()

    cursor2 = db.cursor(MySQLdb.cursors.DictCursor)


    for i in result:
        user = i['author_id']

        query = 'SELECT * FROM ed_users WHERE id =' + str(user)
        cursor2.execute(query)
        result = cursor2.fetchall()

        display_name = result[0]['display_name']
        email_address = result[0]['user_email']
        registered_date = result[0]['user_registered']

        update = "UPDATE firm_contributor SET display_name='%s', email_address='%s', registered_date='%s' WHERE author_id=%s" % (display_name, email_address, registered_date, user)
        print update
        cursor.execute(update)
        cursor.commit()

    cursor.close()
    cursor2.close()

最佳答案

查看与cursor相关的代码,我注意到您正在做与以下内容非常相似的事情:

cursor = soc.cursor(MySQLdb.cursors.DictCursor)
cursor.execute('SELECT * FROM firm_contributor')
result = cursor.fetchall()

update = "UPDATE firm_contributor SET display_name='...'"
cursor.execute(update)
cursor.commit()


select语句似乎在firm_contributor表上获得了读锁,然后更新尝试在表上获得写锁,并且由于它已经具有读锁而遇到了问题,因此写锁定超时。

如果添加以下任何一个,将会发生什么:

cursor.commit()


要么

cursor.close()
cursor = soc.cursor(MySQLdb.cursors.DictCursor)


呼叫fetchall()之后?

这可能导致读锁定被释放,而写锁定起作用。

关于python - 为什么在python中打开多个游标时sql挂断了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23394378/

10-09 07:38