我试图从一个数据库中取出日期并插入到另一个数据库中。尝试更新后,我的功能挂断,导致错误超过锁定等待超时;尝试重新启动交易'。这是因为多个游标是开放的,我如何解决它。
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()
答案 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()
后?
这可能导致释放读锁定,并且写锁定工作。