【问题标题】:SqlAlchemy + MySql 1205, 'Lock wait timeout exceeded; try restarting transaction'SqlAlchemy + MySql 1205, '超过锁定等待超时;尝试重新启动事务'
【发布时间】:2015-09-27 14:55:57
【问题描述】:
我正在尝试从两个表 User 和 UserRoleMapping 中删除一行。
UserRoleMapping 使用 User.id => UserRoleMapping.user_id 引用到 User 表。
我需要使用用户特定的 ID 从两个表中删除一行。
我的代码
session_delete_mapping = Session()
session_delete_user= Session()
if request.method == "POST":
user_id = request.form['user_list']
try :
num_rows_deleted_map = session_delete_mapping.query(UserRoleMapping).filter(UserRoleMapping.user_id == user_id).delete()
num_rows_deleted_user = session_delete_user.query(UserRoleMapping).filter(User.id == user_id).delete()
session_delete_mapping.commit()
session_delete_user.commit()
User.query.filter(User.id == user_id).delete()
flash("Successfully deleted !!")
except Exception as e:
flash("Oops something went wrong : "+ str(e))
session_delete_mapping.rollback()
session_delete_user.rollback()
return render_template('index.html')
但是我的代码抛出了异常
(InternalError) (1205, 'Lock wait timeout exceeded; try restarting transaction') 'DELETE FROM user_role_mapping WHERE user_role_mapping.user_id = %s' ('3',)
【问题讨论】:
标签:
python
mysql
sqlalchemy
flask-sqlalchemy
【解决方案1】:
当服务器无法获取锁以处理表或数据库的操作时会发生这种情况,请尝试按照异常中的建议重新启动事务:
session_delete_mapping = Session()
session_delete_user= Session()
if request.method == "POST":
user_id = request.form['user_list']
try :
num_rows_deleted_map = session_delete_mapping.query(UserRoleMapping).filter(UserRoleMapping.user_id == user_id).delete()
num_rows_deleted_user = session_delete_user.query(UserRoleMapping).filter(User.id == user_id).delete()
session_delete_mapping.commit()
session_delete_user.commit()
User.query.filter(User.id == user_id).delete()
flash("Successfully deleted !!")
except InternalError as e:
# mysql error code of 'lock timeout'
if e.orig[0] == 1205:
# call this handler again with same arguments
else:
flash("Oops something went wrong : "+ str(e))
session_delete_mapping.rollback()
session_delete_user.rollback()
except Exception as e:
flash("Oops something went wrong : "+ str(e))
session_delete_mapping.rollback()
session_delete_user.rollback()
return render_template('index.html')
别忘了导入你捕捉到的异常类from sqlalchemy.exc import InternalError
通常您很少会遇到此异常,但如果不是,您应该检查您的服务器是否存在大量或“停滞”的查询并优化它们。
你可以在 myslq 配置文件中增加 wait_timeout。