项目使用tornado作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
参考:
http://docs.sqlalchemy.org/en/latest/core/pooling.html#sqlalchemy.pool._ConnectionRecord
https://groups.google.com/forum/#!topic/sqlalchemy/qAMe78TV0M0