Django ORM 中的每个事务隔离级别

Posted

技术标签:

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

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

例如:

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

【问题讨论】:

【参考方案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,
            ,
        ,
    

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

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

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

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

【讨论】:

可以接受。谢谢。 使用这种解决方案要记住的一个问题是,如果在事务中进行了更改并且该事务尚未提交,则一个连接不会看到另一个连接所做的任何更改。

以上是关于Django ORM 中的每个事务隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

使用Django和PostgreSQL进行事务(@atomic)的默认隔离级别

事物隔离级别

数据库的特性与隔离级别和spring事务的传播机制和隔离级别

什么是事务?事务的特性?事务的隔离级别?

什么是事务?事务的特性?事务的隔离级别?

Mysql得隔离级别