mysql事务只部分提交

时间:2014-03-13 20:03:42

标签: python mysql sqlalchemy

我一直在看看使用innodb表的部分提交的交易:

  1. 我所有的桌子都使用innodb作为后端
  2. mysql版本:5.5.31-0ubuntu0.13.04.1-log
  3. 基于uwsgi的python web应用程序,每个http请求都包含在一个单独的事务中,该事务可以根据请求期间是否生成异常而提交或回滚
  4. 每个请求服务进程使用一个不跨进程共享的单个mysql连接
  5. 其他几个进程连接到数据库以执行所有包含在事务中的后台任务
  6. 所有事务都是通过sqlalchemy中间件创建和跟踪的,该中间件配置为不更改默认的mysql隔离级别,即REPEATABLE READ
  7. 尽管如此(我多次检查每个项目三次),我的数据库似乎包含半提交的事务:  1. 2表A和B,A包含B的外键(DB中没有定义约束)  2. A包含指向B中不存在的行的有效行。  3. B包含id + 1和id - 1的行。  4.两个表中的两行都插入到单个事务中

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

1 个答案:

答案 0 :(得分:0)

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