【问题标题】:mysql transaction commited only partlymysql事务仅部分提交
【发布时间】:2014-03-13 20:03:42
【问题描述】:

我不断看到使用 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

尽管如此(我对每个项目都检查了三次),但我的数据库似乎包含一半提交的事务: 1. 2 个表 A 和 B,其中 A 包含 B 的外键(数据库中没有定义约束) 2. A 包含指向 B 中不存在的行的有效行。 3. B 包含 id + 1 和 id - 1 的行。 4. 两个表中的两行都插入到一个事务中

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

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2012-12-24
      • 2013-11-22
      • 2016-10-05
      相关资源
      最近更新 更多