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)的默认隔离级别