在mysql超过wait_timeout后,连接会挂掉,服务就会报错 OperationalError: (_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away') ,由于也sqlalchemy关闭了autocommit,隐式使用了事务,还会有错误StatementError: (sqlalchemy.exc.InvalidRequestError)
Can't reconnect until invalid transaction is rolled back
项目使用web框架,使用sqlalchemy作为orm框架.
错误a:
OperationalError:
(_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away')
错误b:
StatementError:
(sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back
错误a是因为mysql的连接到达了wait_timeout, 使用超时的连接就会报错gone away,
错误b是因为连接断开后,事务没有回滚,残留的锁导致后续的查询报错.
解决方案一:打开autocommit
sqlalchemy打开autocommit后, 就会停止使用事务,生成的查询语句立即执行, 防止了错误b.
解决方案二:
在所有访问数据库的地方加异常捕获,报异常时rollback