Django 事务ATOMIC_REQUESTS

     阅读:37

Django 的默认事务行为

Django 的默认行为是以自动提交模式运行。除非事务处于活动状态,否则每个查询都会立即提交到数据库。

将事务绑定到HTTP请求

在 Web 上处理事务的常用方法是将每个请求包装在事务中。在要为其启用此行为的每个数据库的配置中设置ATOMIC_REQUESTS为True。

DATABASES = {
        'default': {
			'ENGINE': 'django.db.backends.mysql',
        	'NAME': 'testdb',
        	'USER': 'hayley',
        	'PASSWORD': '******',
        	'HOST': 'localhost',
        	'PORT': '3306',
            'ATOMIC_REQUESTS': True,
        }
    }

它是这样工作的:在调用视图函数之前,Django 会启动一个事务。如果生成的响应没有问题,则 Django 提交事务。如果视图产生异常,Django 会回滚事务。

您可以使用视图代码中的保存点执行子事务,通常使用atomic()上下文管理器。但是,在视图结束时,将提交所有更改或不提交任何更改。

虽然每个请求都开启事务比较方便,但它也会在流量增加时变得低效。为每个视图打开一个事务有一些开销。对性能的影响取决于应用程序的查询模式以及数据库处理锁定的能力。

以上是全局性的配置, 如果要对某个http请求放水(然后自定义事务),可以用non_atomic_requests修饰器

from django.db import transaction

class xxx(xxxView):
    @transaction.non_atomic_requests
    def post(self, request, *args, **kwargs):
        ...

或者关闭全局事务,为每个请求单独设置事务:


from django.db import transaction

class xxx(xxxView):
    @transaction.atomic
    def post(self, request, *args, **kwargs):
        with transaction.atomic():
            ...