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

简介: 在Django中实现数据库的事务操作在学习MySQL数据库时,MySQL数据库是支持原子操作的.什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费.交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项.

在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/,浏览器的页面上出现

img_5066a854c636155edc260d12a0e7bbca.png

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

img_a5d3618f68956cd4212f367fd34b28a4.png

img_ce90771be40ca52999292b6981d00b4a.png

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

    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")

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

img_076326702e90293fd5375e3613212246.png

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

img_a5d3618f68956cd4212f367fd34b28a4.png

img_ce90771be40ca52999292b6981d00b4a.png

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

目录
相关文章
|
8天前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
102 77
|
3月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
8天前
|
SQL 安全 数据库连接
除了使用Django的ORM,还能通过什么方式在Django中避免SQL注入漏洞?
除了使用Django的ORM,还能通过什么方式在Django中避免SQL注入漏洞?
34 17
|
2天前
|
数据管理 数据库 数据安全/隐私保护
Django—同一项目不同app使用不同数据库
在Django项目中实现不同app使用不同数据库的配置,可以通过配置多数据库、创建数据库路由和配置路由来实现。通过这种方法,可以有效地将数据隔离到不同的数据库,提高数据管理的灵活性和系统的可扩展性。希望本文能为开发者在Django项目中使用多数据库提供清晰的指导。
14 4
|
1月前
|
SQL 定位技术 数据库
深入探索Django ORM:高效数据库操作的秘诀####
本文旨在为读者揭开Django ORM(对象关系映射)的神秘面纱,通过一系列生动的比喻和详实的案例,深入浅出地讲解其核心概念、工作原理及高级特性。我们将一起探讨如何利用Django ORM简化数据库交互,提升开发效率,同时确保数据的一致性和安全性。不同于传统的技术文档,本文将以故事化的形式,带领读者在轻松愉快的氛围中掌握Django ORM的精髓。 ####
|
27天前
|
SQL 存储 Java
数据库———事务及bug的解决
事务的一些概念,并发事务以及并发事务引起的bug,脏读,不可重复读,幻读,数据库中的隔离级别,事务的简单应用
|
2月前
|
SQL 监控 数据库
深入探索Django ORM:高效数据操作的秘诀与实践####
在当今的Web开发领域,提升数据访问层的效率是优化应用性能的关键。本文旨在通过剖析Django框架中的ORM(对象关系映射)机制,揭示其如何简化数据库交互,并探讨一系列高级技巧与策略,帮助开发者构建更高效、可维护的数据访问代码。我们不涉及安装步骤或基础概念,而是聚焦于实战经验分享,旨在为中高级开发者提供深度洞见。 ####
|
3月前
|
数据库
什么是数据库的事务隔离级别,有什么作用
【10月更文挑战第21】什么是数据库的事务隔离级别,有什么作用
32 3
|
3月前
|
存储 关系型数据库 数据挖掘
什么是数据库的事务隔离级别
【10月更文挑战第21】什么是数据库的事务隔离级别
52 1
|
3月前
|
存储 数据库 数据库管理
数据库事务安全性控制如何实现呢
【10月更文挑战第15天】数据库事务安全性控制如何实现呢

热门文章

最新文章