簡體   English   中英

在 Django/Elastic beanstalk/RDS 上更改 MySQL 隔離級別

[英]Changing MySQL isolation level on Django/Elastic beanstalk/RDS

我正在嘗試通過 Django 應用程序更改 RDS 上我的 MySQL 實例的隔離級別。 我已經按照這里的建議

因此,我將 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

結果相同

知道可能出什么問題了嗎? 或者我可以使用的另一種解決方案(也許我可以運行此命令並將其設置為全局隔離級別?)

也許OPTIONS無法處理2個命令。 因此,刪除第一個-僅在創建新表時有用。 並且可能需要在需要執行的任何CREATE TABLEs上指定ENGINE=InnoDB 無論如何,我希望AWS默認使用該功能。 8.0具有該引擎默認值。

您能像下面那樣嘗試嗎,任何人都應該工作。

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

對於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 服務器使用以下命令運行或每次Django 服務器通過編寫代碼重新加載因此每次設置事務Django 服務器使用以下命令運行或每次Django 服務器通過編寫代碼重新加載:

python manage.py runserver 0.0.0.0:8000

對我來說PostgreSQL"init_command": ..."isolation_level" in "OPTIONS": {}不起作用,所以我無法在settings.py中設置SERIALIZABLE

# "settings.py"

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM