【问题标题】:Per-transaction isolation level in Django ORMDjango ORM 中的每个事务隔离级别
【发布时间】:2015-02-07 19:19:32
【问题描述】:

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

例如:

with transaction.commit_on_success(isolation='SERIALIZABLE'):
    bla

【问题讨论】:

    标签: python django transactions django-orm


    【解决方案1】:

    据我所知,没有办法在 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.postgresql',
                'USER': 'postgres_user',
                'PASSWORD': 's3krit',
                'OPTIONS': {
                    'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
                },
            },
        }
    

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

    1. 使用using() QuerySet method 例如User.objects.using('serializable').all

    2. 添加custom manager,指定事务隔离级别的数据库连接

      class SerializableUserManager(models.Manager):
          def get_queryset(self):
              return super(SerializableUserManager, self).get_queryset().using('serializable')
      

    【讨论】:

    • 可以接受。谢谢。
    • 使用这种解决方案要记住的一个问题是,如果在事务中进行了更改并且该事务尚未提交,则一个连接不会看到另一个连接所做的任何更改。
    猜你喜欢
    • 2016-01-20
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多