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 transaction
@transaction.atomic
def seckill(request):
return HttpResponse('秒杀成功')
# cbv开启
from django.db import transaction
from rest_framework.views import APIView
class SeckillAPIView(APIView):
@transaction.atomic
def 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方法提交事务文章来源:https://www.toymoban.com/news/detail-650500.html
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(pk=1)
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 事务提交后,执行某个回调函数
有的时候我们希望当前事务提交后立即执行额外的任务,比如客户下订单后立即邮件通知卖家文章来源地址https://www.toymoban.com/news/detail-650500.html
案例一
def send_email():
print('发送邮件给卖家了')
def seckill(request):
with transaction.atomic():
# 设置回滚点,一定要开启事务
sid = transaction.savepoint()
print(sid)
try:
book = Book.objects.get(pk=1)
book.count = book.count-1
book.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提交异步任务
到了这里,关于django中实现事务的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!