zoukankan      html  css  js  c++  java
  • django数据库事务

    数据库原子操作

    举个例子:

    一个消费者在一个商户里刷信用卡消费,交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项。但是如果银行从消费者的账户里扣完钱之后,还未在商户的帐户里加上相应的款项时,由于某些原因,系统或者数据库出现异常了,那么此时钱已经从消费者的账户里扣除了,但是商户的账户里却没有加上相应的款项,这种情况下,最好的解决办法就是使用数据库的原子性操作,也就是数据库的事务。保证要么同时成功,要么同时失败,然后才向数据库commit。

    Django默认向数据库的提交方式

    Django的默认行为是在自动提交模式下运行。除非事务处于活动状态,否则每个查询都会立即提交到数据库。

    Django自动使用事务或保存点来保证需要多个查询的ORM操作的完整性,尤其是delete()和update()查询。

    事务提交后执行任务

    有时您需要执行与当前数据库事务相关的操作,但前提是事务成功提交。示例可能包括celery任务,电子邮件通知或缓存失效

    Django提供了on_commit()注册回调函数的函数,这些函数应在成功提交事务后执行

    from django.db import transaction
    
    def do_something():
        pass  # send a mail, invalidate a cache, fire off a Celery task, etc.
    
    transaction.on_commit(do_something)
    

      

    django如何实现事务

    from django.db import transaction
    
    def create(request):
        try:
            with transaction.atomic():
                models.Userinfo.objects.create(username="stu01", email="stu01@qq.com")
                models.Group.objects.create(title="python")
    
        except Exception as e:
            return HttpResponse("出现错误....")
        return HttpResponse("ok")
    

      

    这样两条sql语句同时插入成功或失败

      

  • 相关阅读:
    luoguP1080 国王游戏 题解(NOIP2012)(贪心+高精)
    luoguP1079 Vigenère 密码 题解(NOIP2012)
    luoguP2184 贪婪大陆 题解(树状数组)
    luoguP2680 运输计划 题解(二分答案+树上差分)
    树链剖分总结
    树上差分总结
    luoguP3258 [JLOI2014]松鼠的新家 题解(树上差分)
    简单差分(保证你一看就懂)
    luoguP3128 [USACO15DEC]最大流Max Flow 题解(树上差分)
    luoguP1541 乌龟棋 题解(NOIP2010)
  • 原文地址:https://www.cnblogs.com/hongpeng0209/p/9468912.html
Copyright © 2011-2022 走看看