为什么在python中打开多个游标时sql挂起?

时间:2014-04-30 17:24:09

标签: python mysql cursor migration

我试图从一个数据库中取出日期并插入到另一个数据库中。尝试更新后,我的功能挂断,导致错误超过锁定等待超时;尝试重新启动交易'。这是因为多个游标是开放的,我如何解决它。

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()

1 个答案:

答案 0 :(得分:1)

查看与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()后?

这可能导致释放读锁定,并且写锁定工作。