• Django的ORM实现数据库事务操作


    在Django中实现数据库的事务操作

    在学习MySQL数据库时,MySQL数据库是支持原子操作的.

    什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费.

    交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项.

    但是如果银行从消费者的账户里扣完钱之后,还未在商户的帐户里加上相应的款项时.

    由于某些原因,系统或者数据库出现异常了,那么此时钱已经从消费者的账户里扣除了,但是商户的账户里却没有加上相应的款项,让会让商户遭受损失.

    这种情况下,最好的解决办法就是使用数据库的原子性操作.

    如果数据库使用了事务操作,当出现上面的操作异常时,待数据库正常运行后,数据库系统会把先前执行了一半的操作退回到这个操作之前的状态,

    这个通常称为数据库的回滚,也即数据库的原子性操作.

    Django中,正常的数据库操作应该是原子性操作的.

    在Django的ORM中,想使用事务操作时,要先导入一个Django的内置模块

    from django.db import transaction
    

    首先创建一个项目test,项目中有一个应用app01.

    项目的model为:

        from django.db import models
        
        class Userinfo(models.Model):
            username=models.CharField("用户名",max_length=32)
            email=models.EmailField("邮箱",max_length=32)
        
        class Group(models.Model):
            title=models.CharField("组名",max_length=32)
    

    配置好url

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/',views.index),
    ]
    

    路由对应的视图函数为

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

    首在先浏览器中打开http://127.0.0.1:8000/index/,浏览器的页面上出现

    打开对应的数据库可以看到,UserInfo数据表和Group数据表中已经添加一条记录

    现在修改视图函数,使程序出现运行错误,

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

    再次刷新浏览器,可以看到

    而刷新两张数据表,可以看到两张数据库都没有添加数据记录.

    这就是Django的ORM所支持的事务操作.!

  • 相关阅读:
    WPF中为窗体设置背景图片
    Silverlight自定义控件系列 – TreeView (4) 缩进
    Silverlight自定义控件系列 – TreeView (3) 添加展开和收起事件
    Silverlight自定义控件系列 – TreeView (2) 基本布局和States
    Silverlight自定义控件系列 – TreeView (1)
    WPF中的ControlTemplate(控件模板)
    绑定任意格式的XML文档到WPF的TreeView
    WPF具体使用中一些更深层的东西和与特效有关的技术
    浅谈WPF中对控件的位图特效(虚化效果、外辉光效果)
    WPF基础学习
  • 原文地址:https://www.cnblogs.com/renpingsheng/p/7732956.html
Copyright © 2020-2023  润新知