【问题标题】:Django default isolation level and db binary log format errorDjango默认隔离级别和db二进制日志格式错误
【发布时间】:2018-12-25 08:40:09
【问题描述】:

我正在使用pytest-django 在我的django 网络服务器上运行一组测试。我正在尝试在 travis 上的测试/CI 中从 MySQL 数据库服务器切换到 MariaDB,为此我还从 mysqldb python 包切换到 pymysql

在使用 MariaDB 时,我的数据库相关测试所有突然出现一个奇怪的异常:

pymysql.err.InternalError: (1665, 'Cannot execute statement: 由于 BINLOG_FORMAT = STATEMENT 并且至少一个表使用了仅限于基于行的日志记录的存储引擎,因此无法写入二进制日志。InnoDB 仅限于行日志记录当事务隔离级别为 READ COMMITTED 或 READ UNCOMMITTED 时。')

此异常位于该作业的所有测试中的几个异常堆栈中,但我已将其确定为问题的根本原因。

重要的是要注意,在直接在 travis 上运行测试套件的两个作业中,以及在 docker(在 travis 内部)上运行它的另一个作业中,只有一个失败,一个在 python 3.6 上运行。

虽然我大致了解问题的原因,但我找不到很多关于细节或任何突然触发/表现的原因的信息。除了这个Django documentation issue

鉴于它仅针对 python3 测试作业触发,并且 Django2 放弃了对 python2 的支持,我认为这些问题是相关的,但我似乎仍然无法找到一个合理/体面的解决方案。我觉得我至少错过了这里发生的事情背后的一些原因/推理。

我没有对数据库配置进行任何更改,所有服务都使用内置安装运行。

作为参考,this 是 PR 的 travis 工作,以防我错过了一些重要的事情。

【问题讨论】:

    标签: python mysql django mariadb


    【解决方案1】:

    TL;DR:安装更新版本的 MariaDB 解决了这个问题。

    阅读有关该问题的更多信息,我能够确定根本原因确实是由于我的环境中两个 默认 配置之间的冲突:

    1. BINLOG_FORMAT = STATEMENT.

      根据MariaDB's documentation,这是 MariaDB 10.2.4 之前的默认设置。由于我使用的是 Travis-CI 并且因为 using MariaDB on travisCI was documented 10.0 版是如何硬编码,因此默认为上述值。

    2. 事务隔离级别设置为READ COMMITTED

      在Python3上,安装了Django>=2.0,其中事务隔离级别根据Django's documentation设置为READ COMMITTED。这个配置似乎是一个更安全的默认值。

    替换示例 travis mariadb sn-p 中的主要/次要版本字符串:

    addons:
      - mariadb: '10.0'
    

    使用仅主要版本字符串 '10.3' 使 travis 安装更新版本或 MariaDB,默认为更灵活的 BINLOG_FORMAT = MIXED 配置。

    【讨论】:

      【解决方案2】:
      # config as this way, add options
      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'xxx',
              'USER': 'xx',
              'PASSWORD': 'xx',
              'HOST': 'xxx',
              'POST': 'xxx',
              'OPTIONS': {
                  'isolation_level': "repeatable read"
              },
          },
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-05
        • 2017-07-08
        • 2014-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-17
        相关资源
        最近更新 更多