【问题标题】: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

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 2013-02-05
      • 2021-08-07
      • 2021-01-12
      • 2018-10-09
      • 2018-01-12
      • 2019-03-11
      • 2016-08-01
      • 1970-01-01
      相关资源
      最近更新 更多