Django默认隔离级别和db二进制日志格式

2024-06-01 03:17:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pytest-django在我的djangoweb服务器上运行一组测试。在travis上的testing/CI中,我试图从MySQL数据库服务器切换到MariaDB,为此,我还从mysqldbpython包切换到{}。在

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

pymysql.err.InternalError: (1665, 'Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.')

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

需要注意的是,在直接在travis上运行测试套件的两个作业中,以及在docker(travis内部)上运行测试套件的两个作业中,只有一个失败,即运行在python3.6上的作业。在

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

考虑到它只为python3测试任务触发,Django2放弃了对python2的支持,我假设这些问题是相关的,但我似乎仍然无法找到一个合理/体面的解决方案。我觉得我至少遗漏了这里发生的事情背后的一些原因/理由。在

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

作为参考,this是公关的一个travis工作,以防我错过了一些重要的东西。在


Tags: todjango服务器travis数据库read套件pytest
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"
        },
    },
}

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

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

  1. BINLOG_FORMAT = STATEMENT。在

    根据MariaDB's documentation,在10.2.4版本之前,这是MariaDB中的默认值。因为我使用的是Travis CI,并且由于using MariaDB on travisCI was documentedversion10.0是如何硬编码的,因此默认为上述值。

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

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

替换示例travis mariadb片段中的主/次版本字符串:

addons:
  - mariadb: '10.0'

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

相关问题 更多 >