django ATOMIC_REQUESTS

Django默认的事务行为是自动提交,但在HTTP请求中常常需要保证所有SQL操作要么全部成功,要么全部失败。通过设置ATOMIC_REQUESTS=True,可以确保每个请求在一个事务中执行。此外,可以通过non_atomic_requests修饰器或atomic()装饰器来灵活控制事务的使用,以平衡性能和数据一致性。对于高并发场景,应谨慎使用全局事务,以防止性能下降。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值