django默认的事务行为是自动提交,就是每次数据库操作都会立即被提交到数据库中,除非这个事务在激活状态
web应用中,最常用的是将同一个http请求对应的所有sql都放在一个事务中执行(要么所有都成功,要么所有都失败),在settings中设置ATOMIC_REQUESTS=True
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testdb',
'USER': 'hayley',
'PASSWORD': '******',
'HOST': 'localhost',
'PORT': '3306',
'ATOMIC_REQUESTS': True,
}
}
以上是全局性的配置, 如果要对某个http请求放水(然后自定义事务),可以用non_atomic_requests修饰器
from django.db import transaction
class xxx(xxxView):
@transaction.non_atomic_requests
def post(self, request, *args, **kwargs):
...
虽然这种方式很简单,但是访问量大的话,会造成性能损伤,毕竟为每个视图开启一个事物会有额外的开销,所以在实践中,也可以使用atomic()装饰器来装饰需要事务的视图
from django.db import transaction
class xxx(xxxView):
@transaction.atomic
def post(self, request, *args, **kwargs):
...
也可以作为上下文管理器
from django.db import transaction
class xxx(xxxView):
def post(self, request, *args, **kwargs):
#…… 不在事务之中
with transaction.atomic():
#……在事务之中
参考:
http://www.mamicode.com/info-detail-1317046.html
https://blog.youkuaiyun.com/ysjian_pingcx/article/details/51015988