python 更改Django/Elastic beanstalk/RDS上的MySQL隔离级别

dnph8jn4  于 2023-01-04  发布在  Python
关注(0)|答案(3)|浏览(137)

我尝试通过Django应用程序更改RDS上MySQL示例的隔离级别。我遵循了here建议
因此,我将Django数据库设置更改为:

'OPTIONS': {
    'init_command': 'SET default_storage_engine=INNODB; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED'
}

当我直接在数据库(MySQL版本8.0.13)中运行时,此命令工作正常。然而,当我尝试将其部署到Elastic Beanstalk时,我收到以下错误:

Command failed on instance. Return code: 1 Output: (TRUNCATED)... manual that corresponds to your MySQL server version for the right syntax to use near 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED' at line 1")

我还试着把这句话改成:

SET default_storage_engine=INNODB, SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

结果是一样的
知道可能出了什么问题吗?或者我可以使用的另一种解决方案(也许我可以只运行这个命令并将其设置为全局隔离级别?)

sigwle7e

sigwle7e1#

也许OPTIONS不能处理两个命令。所以删除第一个命令--它只在创建一个新表时有用。而且可能需要在任何CREATE TABLEs上指定ENGINE=InnoDB。无论如何,我希望AWS默认为这样。8.0有这个引擎默认值。

e4yzc0pl

e4yzc0pl2#

你能试试下面这样吗,任何人都应该工作。

SET @@SESSION.transaction_isolation = value;
SET SESSION transaction_isolation = value;
SET transaction_isolation = value;
kqhtkvqz

kqhtkvqz3#

对于MySQL,您将能够通过在settings.py中运行原始查询来设置和检查READ COMMITTED,如下所示:

# "settings.py"

from django.db import connection

# ...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'DB_NAME',
        'USER': 'DB_USER',
        'PASSWORD': 'DB_PASSWORD',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

# ↓ ↓ ↓ Set isolation level ↓ ↓ ↓

cursor = connection.cursor()
query = """
        SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
        """
cursor.execute(query)

# ↓ ↓ ↓ Check isolation level ↓ ↓ ↓

cursor.execute('SELECT @@GLOBAL.transaction_isolation;')
print(cursor.fetchone()) # ('read committed',)
  • settings.py在每次Django Server使用下面的命令运行或每次Django Server通过编写代码重新加载时运行,因此事务在每次Django Server使用下面的命令运行或每次Django Server通过编写代码重新加载时设置:
python manage.py runserver 0.0.0.0:8000

对于使用PostgreSQL的我来说,下面"OPTIONS": {}中的"init_command": ..."isolation_level"不起作用,所以我无法在settings.py中设置SERIALIZABLE

# "settings.py"

"OPTIONS": {
    "init_command": "ALTER DATABASE postgres SET DEFAULT_TRANSACTION_ISOLATION TO 'SERIALIZABLE';"
    "isolation_level": psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
}

相关问题