django中实现事务的几种方式

这篇具有很好参考价值的文章主要介绍了django中实现事务的几种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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方法提交事务

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA微服务分布式事务的几种实现方式

    一致性(Consistency) :在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误; 可用性(Availability):在集群中一部分节点故障,也能保证客户端访问系统并得到正确响应,允许一定时间内数据状态不一致; 分区容错性(Partiti

    2024年02月12日
    浏览(51)
  • 【Spring Cloud系列】- 分布式系统中实现幂等性的几种方式

    在开发订单系统时,我们常遇见支付问题,既用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。在以前的单应用系统中,

    2024年02月10日
    浏览(46)
  • 【java缓存、redis缓存、guava缓存】java中实现缓存的几种方式

    这种方式可以简单实现本地缓存,但是实际开发中不推荐使用,下面我们来实现一下这种方式。 首先创建一个管理缓存的类 这个类中有一个静态代码块,静态代码块会在类加载时就执行,我们可以在这里完成对缓存的初始化,决定缓存内一开始就有哪些数据 另外我们还可以

    2024年02月16日
    浏览(35)
  • Spring Boot中操作数据库的几种并发事务方式

    当有多个 并发 事务时,会发生丢失更新异常。来自一个或多个 事务 的更新可能会丢失,因为其他事务会用其结果覆盖它。 让我们通过一个例子来检验一下。考虑以下执行事务的方法。 public void withdraw(Long accountId, double amount) { Account account = accountRepository.findById(accountId).orEl

    2024年01月22日
    浏览(53)
  • python中实现定时任务的几种方案

    总结以下几种方案实现定时任务,可根据不同需求去使用不同方案。 利用while True的死循环,加上 sleep()函数让其暂停一段时间,达到每隔一段时间执行特定任务的目的。 比较简单,例子如下: 主要缺点: 只能设定间隔,不能指定具体的时间 sleep 是一个阻塞函数,也就是说

    2024年02月07日
    浏览(44)
  • python数据结构中实现队列的几种方法

    运行结果: 首尾指针实现 链队 首尾指针实现链队 尾插有头结点实现链队 链队 尾插法 有头结点实现链队 两个栈实现一个队列 list栈

    2024年01月18日
    浏览(45)
  • python的几种输出方式

    1.输出百分比方法 2. print(f “{}”) 的用法 3. .format格式   4. 加号拼接(针对字符串) 扩展知识 -格式化输出 字符 含有 %s 字符串 %d 有符号十进制整数,%06d表示输出的整数显示位数字,不足的地方使用0补全 %f 浮点数,%.02f表示小数点后只显示两位 %% 输出%  %s:代表字符串的占

    2024年04月15日
    浏览(52)
  • Python保存图像的几种方式

    记录读取和保存图像的几种方式 1.1、使用 cv2 读取图片,注意:opencv打开路径中不能有中文!!! 1.2、使用 rasterio 读取遥感影像 1.3、使用 Image 读取图像 2.1、使用 cv2 保存图片 2.2、使用numpy保存 2.3、使用plt保存 参考: https://blog.csdn.net/xzm961226xzm/article/details/120951317 https://bl

    2024年02月11日
    浏览(52)
  • Python 打开网页的几种方式

    方法1:直接调用系统命令 os 方法2:引用webrowser包 方法3:引用selenium工具,解决闪退问题 附:Pycharm 安装selenium 工具说明

    2024年02月16日
    浏览(50)
  • python数组循环的几种方式

     Python中循环数组有几种方式: for-in循环,可以遍历数组中的每一个元素。 while循环,使用索引进行循环。 列表推导式,可以快速创建新的列表。 递归,可以遍历多维数组。 enumerate() 函数,在循环中同时获取索引和元素

    2024年02月16日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包