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