gom传奇网站建设,酒泉哪家公司可以做网站,精准营销数据,行业网站建设运营1.实现事务的三种方式
1.1 全局开启事务--- 全局开启事务#xff0c;绑定的是http请求响应整个过程
DATABASES {default: {#全局开启事务#xff0c;绑定的是http请求响应整个过程ATOMIC_REQUESTS: True, }}
from django.db import transaction# 局部禁用事务
transac…1.实现事务的三种方式
1.1 全局开启事务--- 全局开启事务绑定的是http请求响应整个过程
DATABASES {default: {#全局开启事务绑定的是http请求响应整个过程ATOMIC_REQUESTS: True, }}
from django.db import transaction# 局部禁用事务
transaction.non_atomic_requests
def seckill(request):return HttpResponse(秒杀成功) 1.2 一个视图函数在一个事物中 # fbv开启from django.db import transactiontransaction.atomicdef seckill(request):return HttpResponse(秒杀成功)
# cbv开启
from django.db import transaction
from rest_framework.views import APIView
class SeckillAPIView(APIView):transaction.atomicdef post(self, request):pass
1.3 局部使用事务
from django.db import transaction
def seckill(request):with transaction.atomic(): #不用提交事务 with上下文管理器pass # 都在一个事物中return HttpResponse(秒杀成功)
2 事物的回滚和保存点 # 1 普通事务操作(手动操作)
transaction.atomic() # 开启事务
transaction.commit() # 提交事务
transaction.rollback() # 回滚事务# 2 可以使用上下文管理器来控制(自动操作)
with transaction.atomic(): # 自动提交和回滚
保存点
在事务操作中我们还会经常显式地设置保存点(savepoint) 一旦发生异常或错误我们使用savepoint_rollback方法让程序回滚到指定的保存点 如果没有问题就使用savepoint_commit方法提交事务
from .models import Book
from django.db import transaction
def seckill(request):with transaction.atomic():# 设置回滚点一定要开启事务sid transaction.savepoint()print(sid)try:book Book.objects.get(pk1)book.name 红楼梦book.save()except Exception as e:# 如发生异常回滚到指定地方transaction.savepoint_rollback(sid)print(出异常了回滚)# 如果没有异常显式地提交一次事务transaction.savepoint_commit(sid)return HttpResponse(秒杀成功)
transaction.atomic() # 开启事务
sid transaction.savepoint() # 设置保存点
transaction.savepoint_rollback(sid) # 回滚到保存点
transaction.savepoint_commit(sid) #提交保存点
3 事务提交后执行某个回调函数 有的时候我们希望当前事务提交后立即执行额外的任务比如客户下订单后立即邮件通知卖家 案例一
def send_email():print(发送邮件给卖家了)
def seckill(request):with transaction.atomic():# 设置回滚点一定要开启事务sid transaction.savepoint()print(sid)try:book Book.objects.get(pk1)book.count book.count-1book.save()except Exception as e:# 如发生异常回滚到指定地方transaction.savepoint_rollback(sid)else:transaction.savepoint_commit(sid) #提交事务transaction.on_commit(send_email) #提交事务之后执行send_email函数return HttpResponse(秒杀成功)案例二
transaction.on_commit(lambda: send_sms.delay(1898288322))
#异步提交利用celery提交异步任务