Per-transaction isolation level in Django ORM

后端 未结 1 570
我寻月下人不归
我寻月下人不归 2020-12-16 12:52

Is it possible to set isolation level for custom transaction (but not with raw sql)?

For example, something like:

with transaction.commit_on_success(         


        
相关标签:
1条回答
  • 2020-12-16 13:28

    As far as I know, there's no way to temporarily change the transaction isolation level in Django for an existing database connection(s).

    However, you could setup another database connection(s) that mirrors your default database connection(s) but sets the transaction isolation level.

    e.g. in your 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,
            },
        },
    }
    

    To use the serializable transaction level, you could:

    1. Use the using() QuerySet method e.g. User.objects.using('serializable').all
    2. Add a custom manager that specifies the database connection with the transaction isolation level

      class SerializableUserManager(models.Manager):
          def get_queryset(self):
              return super(SerializableUserManager, self).get_queryset().using('serializable')
      
    0 讨论(0)
提交回复
热议问题