Python mysql事务仅部分提交

Python mysql事务仅部分提交,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我一直看到使用innodb表的部分提交事务: 我的所有表都使用innodb作为后端 mysql版本:5.5.31-0ubuntu0.13.04.1-log 基于uwsgi的pythonweb应用程序,每个http请求都包装在一个单独的事务中,该事务要么提交,要么回滚,这取决于请求期间是否生成异常 每个请求服务进程都使用一个mysql连接,该连接不在进程之间共享 另外两个进程连接到数据库以执行后台任务,这些任务都打包在事务中 事务都是通过sqlalchemy中间件创建和跟踪的,该中间件被配置为不改

我一直看到使用innodb表的部分提交事务:

  • 我的所有表都使用innodb作为后端
  • mysql版本:5.5.31-0ubuntu0.13.04.1-log
  • 基于uwsgi的pythonweb应用程序,每个http请求都包装在一个单独的事务中,该事务要么提交,要么回滚,这取决于请求期间是否生成异常
  • 每个请求服务进程都使用一个mysql连接,该连接不在进程之间共享
  • 另外两个进程连接到数据库以执行后台任务,这些任务都打包在事务中
  • 事务都是通过sqlalchemy中间件创建和跟踪的,该中间件被配置为不改变默认的mysql隔离级别(可重复读取)
  • 尽管如此(我对每个项目进行了两次三重检查),我的数据库似乎包含一半提交的事务: 1.2表A和表B中的A包含B的外键(DB中未定义任何约束) 2.A包含指向B中不存在的行的有效行。 3.B包含id为+1和id为-1的行。 4.两个表中的两行都插入到单个事务中


    总而言之,我看不出我可能做错了什么。我无法想象我在mysql存储后端遇到了一个bug,因此,我正在寻求有关如何进一步调试此问题的帮助,以及我上面所做的最有可能是错误的假设。

    我花了一些时间,但事务似乎是由错误1213(死锁)和1205(超过锁等待超时)自动回滚的。这些错误被一些内部中间件捕获,这些中间件试图再次执行失败的语句,而不是将错误转发到事务层,在事务层中,整个事务可以作为一个整体重试或放弃。结果是,代码将继续正常执行,前提是正在进行的事务在mysql服务器回滚时仍在进行