Django ORM中的每事务隔离级别

Pav*_*rin 16 python django transactions django-orm

是否可以为自定义事务设置隔离级别(但不能使用原始sql)?

例如,类似于:

with transaction.commit_on_success(isolation='SERIALIZABLE'):
    bla
Run Code Online (Sandbox Code Playgroud)

小智 15

据我所知,没有办法暂时更改Django中现有数据库连接的事务隔离级别.

但是,您可以设置另一个镜像默认数据库连接的数据库连接,但设置事务隔离级别.

例如在你的settings.py中:

DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit',
    },
    'serializable': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresl',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit',
        'OPTIONS': {
            'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

要使用可序列化的事务级别,您可以:

  1. 使用using() QuerySet方法, 例如User.objects.using('serializable').all
  2. 添加一个自定义管理器,用于指定具有事务隔离级别的数据库连接

    class SerializableUserManager(models.Manager):
        def get_queryset(self):
            return super(SerializableUserManager, self).get_queryset().using('serializable')
    
    Run Code Online (Sandbox Code Playgroud)